Java之jdk和CGLib实现动态代理
【摘要】 1 jdk实现动态代理源码实现
这里需要用到InvocationHandler接口
public interface Hello { public void sayHello();}
public class HelloImpl implements Hello { @Override public void sayHello() { System.out....
1 jdk实现动态代理源码实现
这里需要用到InvocationHandler接口
-
public interface Hello {
-
public void sayHello();
-
}
-
public class HelloImpl implements Hello {
-
-
@Override
-
public void sayHello() {
-
System.out.println("hello word");
-
}
-
}
-
import java.lang.reflect.InvocationHandler;
-
import java.lang.reflect.Method;
-
-
public class HelloInvocationHandler implements InvocationHandler{
-
-
private Object object;
-
-
PeopleInvocationHandler(Object object){
-
this.object = object;
-
}
-
-
@Override
-
public Object invoke(Object proxy, Method method, Object[] args)
-
throws Throwable {
-
System.out.println("-------- start ---------");
-
Object invoke = method.invoke(people, args);
-
System.out.println("-------- end ---------");
-
return invoke;
-
}
-
}
-
import java.lang.reflect.Proxy;
-
-
public class Test {
-
public static void main(String[] args) {
-
HelloImpl hello = new HelloImpl();
-
HelloInvocationHandler invocationHandler = new HelloInvocationHandler(hello);
-
Hello proxy = (Hello) Proxy.newProxyInstance(HelloImpl.getClass().getClassLoader(), HelloImpl.getClass().getInterfaces(), invocationHandler);
-
proxy.sayHello();
-
}
-
}
2 CGLib实现动态代理源码实现
这里需要用到MethodInterceptor接口和Enhancer
-
public class Hello {
-
-
public Hello() {
-
System.out.println("Hello...");
-
}
-
-
public void print() {
-
System.out.println("hello word");
-
}
-
}
-
public class CglibProxyIntercepter implements MethodInterceptor {
-
@Override
-
public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
-
//对目标方法进行拦截处理
-
System.out.println("before...");
-
Object object = methodProxy.invokeSuper(sub, objects);
-
System.out.println("after...");
-
return object;
-
}
-
}
-
public class Test {
-
public static void main(String[] args) {
-
//创建加强器,用来创建动态代理类
-
Enhancer enhancer = new Enhancer();
-
//为加强器指定要代理的业务类
-
enhancer.setSuperclass(Hello.class);
-
//设置回调
-
enhancer.setCallback(new CglibProxyIntercepter());
-
//创建代理对象
-
Hello proxy= (Hello) enhancer.create();
-
proxy.print();
-
}
-
}
result
-
before...
-
hello word
-
after...
3 对比jdk实现动态代理CGLib实现动态代理
1)、JDK
内部主要是通过反射来实现。
2)、CGLib
CGLib是依靠asm字节码处理框架实现的高性能Code生成类库,可以在运行时扩展Java类或者实现接口?当然可以,CGLib对用户隐藏了asm复杂的内部实现,提供了Developer友好、面向特定功能的实现,比如方法拦截(Interpreter)、懒加载(Lazyloader & Dispatcher)等,AOP中的方法拦截,Hibernate中的延迟加载都利用了CGLib
特点:可以不通过接口实现动态代理的优点之外,还有处理速度快、效率高的优点!因为生成代码比Java反射的速度要快很多.
文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。
原文链接:chenyu.blog.csdn.net/article/details/103286545
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)