欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java se之动态代理

程序员文章站 2022-03-04 12:17:15
...

转载自 Java se之动态代理

 

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

    }
}