java动态代理类的实现

动态代理分为: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值