关于反射和动态代理

 

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();

 

posted @ 2019-04-23 00:34  toov5  阅读(131)  评论(0)    收藏  举报