动态代理分为:JDK动态代理和CGLIB动态代理
JDK动态代理和CGLIB动态代理类的区别:
JDK动态代理:1.只能代理实现了的接口的类;2.没有实现接口的类不能实现JDK的动态代理。
CGLIB动态代理:1.针对类来实现代理;2.对指定目标产生一个子类,通过方法拦截技术拦截所有的父类方法的调用。
JDK的动态代理需要一个实现了InvocationHandler的接口和Proxy类共同完成。
InvocationHandler接口:是代理类的实例的调用处理程序的接口,每个代理类的实例都有一个关联的调用处理程序,对代理实例调用方法时,将对方法 调用进行编码并将其指派到他的调用处理程序的invoke方法。
Proxy类:用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
Proxy类中有一个静态方法newProxyInstance(参数1,参数2,参数3)用来创建动态代理类的实例。
参数1:
- 定义代理类的类加载器java实现某一个文件的时候需要将它对应的.class文件加到JVM虚拟机中,classLoader方法将.class文件加入
到JVM虚拟几种,因此参数1可以是当前项目中的任何一个类的classloader。
这里我们举一个JDK动态代理的例子
Move接口
public interface Move { public void run(); } |
public class Car implements Move { public void run() { System.out.println("汽车行驶中。。。"); } } |
public class ProxyInvocationHandler implements InvocationHandler { private Move move; public void setMove(Move move) { this.move = move; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("汽车开始行驶"); method.invoke(move, args); System.out.println("汽车行驶结束"); return null; } } |
public class test1 { public static void main(String arg[]){ Move mo=new Car(); ProxyInvocationHandler ph=new ProxyInvocationHandler(); ph.setMove(mo); Move aa=(Move)Proxy.newProxyInstance(mo.getClass().getClassLoader(), Car.class.getInterfaces(), ph); aa.run(); } } |