关于反射和动态代理
JDK动态代理:
1. 目标类接口:
public interface TargetInterface { public void method(); }
2. 目标类
public class Target implements TargetInterface { @Override public void method() { System.out.println("Target running...."); } }
3. 动态代理代码
Target target = new Target(); //创建目标对象final Advice advice = new Advice(); //增强对象 //创建代理对象, 返回值的类型为 接口类型 TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance( target.getClass().getClassLoader(), //目标对象类加载器target.getClass().getInterfaces(), // 目标对象相同的字节码对象数组 new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) // 代用代理对象的任何方法,实质置顶的都是invoke方法 throws Throwable { advice.before(); // 前置增强 Object invoke = method.invoke(target, args); //执行目标方法 advice.afterReturning() //后置增强return invoke; // 这里的返回值为null } } );
4. 动态代理方法测试
proxy.method();
Cglib动态代理:
1. 目标类
public class Target { public void method() { System.out.println("Target running...."); } }
2. 动态代理代码
Target target = new Target(); //创建目标对象 Enhancer enhancer = new Enhancer(); //创建增强器 enhancer.setSuperclass(Target.class); //设置父类 enhancer.setCallback(new MethodInterceptor() { //设置回调 @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("前置代码增强...."); Object invoke = method.invoke(target, objects); System.out.println("后置代码增强...."); return invoke; } }); Target proxy = (Target) enhancer.create(); //创建代理对象
3. 调用代理对象的方法测试
proxy.method();

浙公网安备 33010602011771号