java.lang.reflect..newProxyInstance(
loader, <?>[] interfaces, h) throws
Returns an instance of a proxy class for the specified interfaces that dispatches method invocations to the specified invocation handler
上面这句的意思是该方法返回一个指定接口的一个代理类, 这个接口将方法调用派遣到指定的调用句柄, 所谓invocation handler也就是代理。
很明显JDK中要被动态代理的类需要实现一个接口。
public class RobotProxy implements InvocationHandler {
private Object target;
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("Robot proxy access");
Object result = method.invoke(target, args);
System.out.println("Robot proxy leave");
return result;
}
public Object getInstance(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
}
使用代理
Robot robot = new Robot();
RobotProxy rProxy = new RobotProxy();
Language iRobot = (Language)rProxy.getInstance(robot);
iRobot.spell("hello world, my name is an intelegent ROBOT!");
这种代理返回的是接口类型
Robot iRobot = (Robot)rProxy.getInstance(robot);
改成上面代码后会报错
Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to Robot
at RobotTest.main(RobotTest.java:13)
CGLIB则是通过生成类的子类来实现的动态代理, 这样就允许不实现接口也能被代理。
public class RobotCglibProxy implements MethodInterceptor {
private Object target;
public Object getInstance(Object target){
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("Robot cglib proxy access");
Object result = proxy.invoke(target, args);
System.out.println("Robot cglib proxy leave");
return result;
}
}
为了测试我把接口去掉
public class Robot {
public void spell(String words) {
System.out.println(words);
}
public String getRobotName(){
return "Timi";
}
}
Robot robot = new Robot();
RobotCglibProxy rcProxy = new RobotCglibProxy();
Robot icRobot = (Robot)rcProxy.getInstance(robot);
icRobot.spell("hello world, my name is an intelegent ROBOT!");
System.out.println("Robot name is :"+icRobot.getRobotName());
分享到:
相关推荐
AOP之JDK动态代理和CGLib动态代理 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45195383
JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)
NULL 博文链接:https://jummy.iteye.com/blog/255628
JDK动态代理和Cglib动态代理实例源码
java静态代理 jdk动态代理 cglib动态代理 代理原理
java代理机制 JDK动态代理和cglib代理 详解
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1711218
Spring框架的AOP中重要的一个知识点,动态代理,springAOP框架会根绝实际情况选择使用jdk的动态代理还是cglib的动态代理
jdk 和 cglib的简单动态代理,闲来无事 写写。有需要的朋友可以看看
实现java动态代理的两个实例,jdk动态代理和cglib
jdk 的动态代理和CGLIB代理
静态代理、jdk动态代理、cglib动态代理
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)
该资源里面有Jdk动态代理,cglib动态代理,反射和拦截器(链)示例,里面也有所需要的jar包,下载下来导入eclipse即可运行,有问题请问我
通过从静态代理、JDK 动态代理、CGLIB 动态代理来进行本文的分析。 静态代理 静态代理就是在程序运行之前,代理类字节码.class就已编译好,通常一个静态代理类也只代理一个目标类,代理类和目标类都实现相同的接口。...
JDK代理和Cglib代理,下载源码清楚了解二者区别
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...
jdk动态代理与cglib动态度代理的区别原理代码jar包
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
JAVA JDK静态代理、动态代理、CGlib代理的代码演示 为对象增加功能