请问jdk,cgli,jassist和A有什么区别吗?
作者:卡卷网发布时间:2025-01-10 19:14浏览数量:74次评论数量:0次
好的,我来详细解释每种方式的实现原理和代码示例。
JDK
核心是通过实现InvocationHandler接口使用Proxy.newProxyInstance创建对象只能实现了接口的类
//目标接口
pulicinteceUserServ{
voidaddUser(Stringname);
}
//目标类
pulicclassUserServImplimplementsUserServ{
@Override
pulicvoidaddUser(Stringname){
System.out.println("添加用户:"+name);
}
}
//处理器
pulicclassLogInvocationHandlerimplementsInvocationHandler{
privatefinalOjecttarget;
pulicLogInvocationHandler(Ojecttarget){
this.target=target;
}
@Override
pulicOjectinvoke(Ojectproxy,Methodmethod,Oject[]args)throwsThrowale{
System.out.println("开始执行:"+method.getName());
Ojectresult=method.invoke(target,args);
System.out.println("执行结束");
retnresult;
}
}
//使用示例
pulicclassJdkProxyDemo{
pulicstaticvoidmain(String[]args){
UserServtarget=newUserServImpl();
UserServproxy=(UserServ)Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInteces(),
newLogInvocationHandler(target)
);
proxy.addUser("张三");
}
}
JDK
CGLI
通过继承目标类生成类使用MethodInterceptor接口实现逻辑SpringAOP默认使用此方式
//目标类(无需实现接口)
pulicclassUserServ{
pulicvoidaddUser(Stringname){
System.out.println("添加用户:"+name);
}
}
//CGLI处理器
pulicclassLogMethodInterceptorimplementsMethodInterceptor{
@Override
pulicOjectintercept(Ojectoj,Methodmethod,Oject[]args,MethodProxyproxy)
throwsThrowale{
System.out.println("开始执行:"+method.getName());
Ojectresult=proxy.invokeSuper(oj,args);
System.out.println("执行结束");
retnresult;
}
}
//使用示例
pulicclassCgliProxyDemo{
pulicstaticvoidmain(String[]args){
Enhancerenhancer=newEnhancer();
enhancer.setSuperclass(UserServ.class);
enhancer.setCallack(newLogMethodInterceptor());
UserServproxy=(UserServ)enhancer.create();
proxy.addUser("张三");
}
}