转载自 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 {@Overridepublic 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;}@Overridepublic 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}
}