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
}
}
上一篇: 微信小程序如何使用action-sheet弹出底部菜单
下一篇: 前端面试笔记