Java动态代理实现方法小结
这篇文章主要介绍了Java动态代理实现方法,结合实例形式总结分析了java基于JDK、CGLIB及CGLIB实现动态代理的相关操作技巧,需要的朋友可以参考下本文实例讲述了java动态代理实现方法。分享给大家供大家参考,具体如下:
静态代理了解的差不多了,但是对于动态代理理解的还不是很通透,这里先把一些常用的动态代理实现方法记录下来,日后时常看看争取早日融会贯通。
1、jdk实现动态代理
主要使用了proxy.newproxyinstance()方法,该方法的官方解释为:返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
public interface isomeservice {
string dofirst();
void dosecond();
string dothird();
}
//目标类:代理类要增强的类
public class someserviceimpl implements isomeservice {
@override
public string dofirst() {
return "aaabbb";
}
@override
public void dosecond() {
system.out.println("someserviceimpl:执行dosecond()");
}
@override
public string dothird() {
return "aaa";
}
}
public class mytest {
public static void main(string[] args) {
isomeservice target = new someserviceimpl();
isomeservice someservice = (isomeservice) proxy.newproxyinstance(
target.getclass().getclassloader(),
target.getclass().getinterfaces(),
new invocationhandler() {
// proxy:代理对象
// method:目标方法
// args:目标方法的参数列表
@override
public object invoke(object proxy, method method, object[] args) throws throwable {
object result = method.invoke(target, args);
if(result!=null) {
result=((string)result).touppercase();
}
return result;
}
});
system.out.println(someservice.dofirst());
someservice.dosecond();
system.out.println(someservice.dothird());
}
}
2、cglib实现动态代理(没接口)
使用jdk的proxy实现动态代理,要求目标类与代理类实现相同的接口,若目标类不存在接口,则无法使用该方式实现。
对于没有接口的类,要为其创建动态代理,就要使用cglib来实现。cglib动态代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。使用cglib生成代理类,要求目标类必须能被继承,因此不能是final类。
//目标类:代理类要增强的类
public class someservice {
public string dofirst() {
system.out.println("someserviceimpl:执行dofirst()");
return "aaabbb";
}
public void dosecond() {
system.out.println("someserviceimpl:执行dosecond()");
}
}
//注意:使用cglib动态代理,要求目标类不能是final的
//cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承
public class cglibfactory implements methodinterceptor {
private someservice target;
public cglibfactory() { }
public cglibfactory(someservice target) {
this.target = target;
}
public someservice mycglibcreator() {
enhancer enhancer = new enhancer();
//指定父类,即目标类。因为cglib动态代理增强的原理是:子类增强父类
enhancer.setsuperclass(someservice.class);
//设置回调接口对象
enhancer.setcallback(this);
//create()方法用于创建cglib动态代理对象
return (someservice)enhancer.create();
}
//回调函数的执行条件:代理对象执行目标方法时会触发该方法
@override
public object intercept(object obj, method method, object[] args, methodproxy proxy) throws throwable {
object invoke = method.invoke(target, args);
if(invoke!=null) {
invoke=((string)invoke).touppercase();
}
return invoke;
}
}
public class mytest {
public static void main(string[] args) {
someservice target = new someservice();
someservice proxy = new cglibfactory(target).mycglibcreator();
proxy.dofirst();
}
}
3、cglib实现动态代理(有接口)
在有接口的情况下利用cglib实现动态代理跟没有接口的情况下利用cglib实现动态代理,其实差不多。
public interface isomeservice {
string dofirst();
void dosecond();
string dothird();
}
//目标类:代理类要增强的类
public class someservice implements isomeservice {
public string dofirst() {
return "aaabbb";
}
public void dosecond() {
system.out.println("someserviceimpl:执行dosecond()");
}
@override
public string dothird() {
return "third";
}
}
//注意:使用cglib动态代理,要求目标类不能是final的
//cglib动态代理的增强原理是:子类增强父类,所以目标类必须能被继承
public class cglibfactory implements methodinterceptor {
private isomeservice target;
public cglibfactory() { }
public cglibfactory(isomeservice target) {
this.target = target;
}
public isomeservice mycglibcreator() {
enhancer enhancer = new enhancer();
//指定父类,即目标类。因为cglib动态代理增强的原理是:子类增强父类
enhancer.setsuperclass(isomeservice.class);
//设置回调接口对象
enhancer.setcallback(this);
//create()方法用于创建cglib动态代理对象
return (isomeservice)enhancer.create();
}
//回调函数的执行条件:代理对象执行目标方法时会触发该方法
@override
public object intercept(object obj, method method, object[] args, methodproxy proxy) throws throwable {
object invoke = method.invoke(target, args);
if(invoke!=null) {
invoke=((string)invoke).touppercase();
}
return invoke;
}
}
public class mytest {
public static void main(string[] args) {
isomeservice target = new someservice();
isomeservice proxy = new cglibfactory(target).mycglibcreator();
system.out.println(proxy.dofirst());
proxy.dosecond();
system.out.println(proxy.dothird());
}
}
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/xiaouncle/article/details/80413350
http://www.zzvips.com/article/176851.html
页:
[1]