基于jdk * 和cglib * 实现及区别说明
作者:yujiubo2008 时间:2022-04-11 00:32:44
jdk * 和cglib * 实现及区别
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
代理模式又分为:
静态代理
jdk *
cglib *
由于静态代理会产生过多的代理类,一旦接口增加方法,目标对象与代理对象都要进行修改,不易维护。
而 * 是动态地在内存中构建代理对象,从而实现对目标对象的代理功能,接口增加方法时代理对象不受影响 。
下面我们讲讲jdk * 和cglib * 实现及区别
jdk * 实现
@Test
public void test(){
IPerson target = new ManPerson();
IPerson proxy = (IPerson)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new PersonInvocationHandler(target));
proxy.eat();
proxy.sleep();
}
// 代理对象
class PersonInvocationHandler implements InvocationHandler{
private Object target;
public PersonInvocationHandler(Object target){
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
System.out.println("start");
Object result = method.invoke(target, args);
System.out.println("end");
return result;
}
}
// 目标对象
class ManPerson implements IPerson{
@Override
public void eat(){
System.out.println("吃饭中......");
}
@Override
public void sleep(){
System.out.println("睡觉中......");
}
}
// 目标对象接口
interface IPerson{
void eat();
void sleep();
}
cglib *
@Test
public void test(){
Person proxy = (Person)Enhancer.create(Person.class, new PersonMethodInterceptor());
proxy.eat();
proxy.sleep();
}
// 代理对象
class PersonMethodInterceptor implements MethodInterceptor{
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable{
System.out.println("start");
Object result = methodProxy.invokeSuper(o, objects);
System.out.println("end");
return result;
}
}
目标对象
public class Person{
public void eat(){
System.out.println("吃饭中......");
}
public void sleep(){
System.out.println("睡觉中......");
}
}
区别
1.JDK * 是实现了被代理对象的接口,Cglib是继承了被代理对象。
2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。
3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。
来源:https://blog.csdn.net/yujiubo2008/article/details/123137340
标签:jdk, , ,cglib
0
投稿
猜你喜欢
Spring Boot 利用 XML 方式整合 MyBatis
2023-02-09 23:01:18
javaweb Servlet开发总结(二)
2023-10-31 11:51:48
C# 爬虫简单教程
2022-04-24 14:10:53
Spring源码解析之编程式事务
2023-06-20 19:17:49
java在网页上面抓取邮件地址的方法
2023-10-01 19:18:21
SpringBoot文件分片上传的示例代码
2023-06-18 11:30:15
Java Scala实现数据库增删查改操作详解
2022-02-03 05:09:22
Spring Boot2发布调用REST服务实现方法
2023-12-10 20:03:49
Java之如何关闭流
2023-11-04 21:29:11
浅谈java中Math.random()与java.util.random()的区别
2023-11-26 16:37:16
Java 继承与多态的深入理解
2023-10-05 04:25:41
说说@ModelAttribute在父类和子类中的执行顺序
2022-07-31 17:59:55
浅析Java内存模型与垃圾回收
2023-11-23 06:11:58
springboot+log4j.yml配置日志文件的方法
2023-08-07 11:33:17
SpringBoot Profile多环境配置方式
2023-12-14 01:44:24
SpringIOC框架的简单实现步骤
2021-10-28 21:44:35
关于MyBaties的基本配置标签总结
2022-08-09 17:28:44
浅谈Java中Int、Integer、Integer.valueOf()、new Integer()之间的区别
2023-10-29 20:08:53
springmvc限流拦截器的示例代码
2021-09-08 02:50:55
spring多数据源配置实现方法实例分析
2023-06-06 22:15:56