一、JDK代理示例java
JDK动态代理只能对实现了接口的类生成代理,不能针对类代理,JDK动态代理须要以下类:接口、实现类、实现InvocationHandler接口的代理类(这个类中包括如下方法:能够传入目标对象的构造函数,InvocationHandler接口方法的实现能够执行目标方法,获得目标对象的代理对象)spring
代码示例以下:接口框架
package jicu.proxy.jdk; public interface Print { void printWords(); void printNumbers(); }
实现类:ide
package jicu.proxy.jdk; public class PrintImpl implements Print { public PrintImpl() { // TODO Auto-generated constructor stub } @Override public void printWords() { // TODO Auto-generated method stub System.out.println("this is PrintImpl printWords()"); } @Override public void printNumbers() { // TODO Auto-generated method stub System.out.println("this is PrintImpl printNumbers()"); } }
代理类:函数
package jicu.proxy.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class JdkProxy implements InvocationHandler { private Object object; /** * 构造方法传入目标对象 * * @param object */ public JdkProxy(Object object) { // TODO Auto-generated constructor stub this.object = object; } /** * 执行目标对象的方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("before method invoke"); // 执行目标对象的方法 Object o = method.invoke(object, args); System.out.println("after method invoke"); return o; } /** * 获取目标对象的代理对象 * * @return */ public Object getProxy() { return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), object.getClass().getInterfaces(), this); } }
测试方法:测试
package jicu.proxy.jdk; public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub // 目标对象 Print print = new PrintImpl(); // 代理类 JdkProxy jdkProxy = new JdkProxy(print); // 代理对象 Print printProxy = (Print) jdkProxy.getProxy(); printProxy.printWords(); printProxy.printNumbers(); } }
二、cglib是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,其底层是经过使用一个小而块的字节码处理框架ASM,来转换字节码并生成新的类this
cglib代理示例代理
package soundsystem; import java.lang.reflect.Method; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; public class CglibProxy { public static void main(String[] args) { // TODO Auto-generated method stub Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(CglibProxy.class); enhancer.setCallback(new MethodInterceptorImpl()); // 生成代理对象 CglibProxy cgPxocy = (CglibProxy) enhancer.create(); cgPxocy.test(); } public void test() { // TODO Auto-generated method stub System.out.println("this is CglibProxy test()"); } /** * 经过代理对象调用目标方法 * * @author timi * */ private static class MethodInterceptorImpl implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // TODO Auto-generated method stub System.out.println("before invoke"); Object o = proxy.invokeSuper(obj, args); System.out.println("after invoke"); return o; } } }