jdk动态代理:

  • jdk动态代理是 需要提供一个实现了InvocationHandler接口的处理类;

  • 通过Proxy的newProxyInstance()方法,参数有三个,第一个是
    类构造器classloader,第二个是目标类实现的接口,这是必须的;第三个就是上面自定义的处理类Handler;

局限是必须是目标类实现了接口,否则无法用java提供的动态代理,但是CGlib进行了补充,通过实现目标类的子类来进行代理。

大家在熟悉不过的便是AOP了,spring中AOP便是通过 java 动态代理 和 CGlib两种方式实现的。

通过以下例子来简单认识jdk动态代理:

public interface Bank {
    public void save();
}
public class ICBCBank implements Bank {
    @Override
    public void save() {
        System.out.println("工商存钱");
    }

}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyHandler implements InvocationHandler{

    private Object target;

    MyHandler(Object target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object obj = method.invoke(target, args);
        after();
        return obj;
    }

    private void before(){
        System.out.println("检查钱是否完整无存");
    }

    private void after(){
        System.out.println("如果有错,就回滚");
    }
}
import java.lang.reflect.Proxy;

public class ProxyDemo {
    public static void main(String[] args) {
        Bank bank =  new ICBCBank();
        MyHandler handler = new MyHandler(bank);

        Bank obj =  (Bank) Proxy.newProxyInstance(bank.getClass().getClassLoader(), 
                bank.getClass().getInterfaces(), 
                handler);
        obj.save();
        //System.out.println(obj.getClass().getName());//com.sun.proxy.$Proxy0

    }
}
posted on 2017-07-02 11:35  菜码农先生  阅读(88)  评论(0编辑  收藏  举报