java动态代理类的实现

来源:互联网 发布:js md5 编辑:程序博客网 时间:2024/05/16 23:36

动态代理分为: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。
参数2 - 代理类要实现的接口列表,这个参数必须是实现了接口的类的getInstance方法 
参数3- 指派方法调用的调用处理程序 。通过这个参数,通过代理类实例调用方法是,会自动跳转到这个类中的invoke中,并执行相关的方法

这里我们举一个JDK动态代理的例子

Move接口

public interface Move {
public void run();
}Car实例

public class Car implements Move {
public void run() {
System.out.println("汽车行驶中。。。");
}
}继承了InvocationHandler的类

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;
}
}JDK动态代理类的测试

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();
}
}

0 0
原创粉丝点击