首页 / JAVA / Java基础之何为动态代理?
Java基础之何为动态代理?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java基础之何为动态代理?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2510字,纯文字阅读大概需要4分钟。
内容图文
何为动态署理?
在程序运转期,创立目标目标的署理目标,对目标目标中的办法进行功用性增强的一种技术;它便是JVM中,目标办法的阻拦器
writelessdomore!!
回顾OOP(面向目标编程)
三大特征:封装、承继和多态比如说,有Dog类、Cat类、Horse类,它们都有eat办法,run办法,依照OOP的编程思维,那么咱们能够抽象出父类Animal,在父类中放置相同的特点或者办法,这样来防止多子类中重复的代码。一切皆目标,很牛逼了,其实它有缺点!
OOP是纵向抽取和承继体系,OOP许多场合都能够处理咱们的问题【代码重复问题】,但是有一些场合,也有它处理不了的需求被处理的很多的代码重复问题。
1.1什么是动态署理?
==动态署理便是,在程序运转期,创立目标目标的署理目标,并对目标目标中的办法进行功用性增强的一种技术==。在生成署理目标的过程中,目标目标不变,署理目标中的办法是目标目标办法的增强办法。能够理解为运转期间,目标中办法的动态阻拦,在阻拦办法的前后履行功用操作。
署理类在程序运转期间,创立的署理目标称之为动态署理目标。这种情况下,创立的署理目标,并不是事先在Java代码中界说好的。而是在运转期间,依据咱们在动态署理目标中的“指示”,动态生成的。也便是说,你想获取哪个目标的署理,动态署理就会为你动态的生成这个目标的署理目标。动态署理能够对被署理目标的办法进行功用增强。有了动态署理的技术,那么就能够在不修正办法源码的情况下,增强被署理目标的办法的功用,在办法履行前后做任何你想做的工作。
创立署理目标的两个办法:
//JDK动态署理
Proxy.newProxyInstance(三个参数);
//CGLib动态署理
Enhancer.create(两个参数);
正常类创立目标的过程:
动态署理创立署理目标的过程:
1.2两种常用的动态署理办法
根据接口的动态署理提供者:JDK运用JDK官方的Proxy类创立署理目标留意:署理的目标目标有必要完成接口根据类的动态署理提供者:第三方CGLib运用CGLib的Enhancer类创立署理目标留意:如果报asmxxxx反常,需求导入asm.jar包publicclassLogProxy{
/**
*生成目标的署理目标,对被署理目标进行一切办法日志增强
*参数:原始目标
*返回值:被署理的目标
*JDK动态署理
*根据接口的动态署理
*被署理类有必要完成接口
*JDK提供的
*/
publicstaticObjectgetObject(finalObjectobj){
/**
*创立目标的署理目标
*参数一:类加载器
*参数二:目标的接口
*参数三:调用处理器,署理目标中的办法被调用,都会在履行办法。对一切被署理目标的办法进行阻拦
*/
ObjectproxyInstance=Proxy.newProxyInstance(obj.getClass().getClassLoader()
,obj.getClass().getInterfaces(),newInvocationHandler(){
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
//办法履行前
longstartTime=System.currentTimeMillis();
Objectresult=method.invoke(obj,args);//履行办法的调用
//办法履行后
longendTime=System.currentTimeMillis();
SimpleDateFormatsdf=newSimpleDateFormat();
System.out.printf(String.format("%s办法履行结束时间:%%s;办法履行耗时:%%d%%n"
,method.getName()),sdf.format(endTime),endTime-startTime);
returnresult;
}
});
returnproxyInstance;
}
/**
*运用CGLib创立动态署理目标
*第三方提供的的创立署理目标的办法CGLib
*被署理目标不能用final修饰
*运用的是Enhancer类创立署理目标
*/
publicstaticObjectgetObjectByCGLib(finalObjectobj){
/**
*运用CGLib的Enhancer创立署理目标
*参数一:目标的字节码文件
*参数二:办法的阻拦器
*/
ObjectproxyObj=Enhancer.create(obj.getClass(),newMethodInterceptor(){
publicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{
//办法履行前
longstartTime=System.currentTimeMillis();
ObjectinvokeObject=method.invoke(obj,objects);//履行办法的调用
//办法履行后
longendTime=System.currentTimeMillis();
SimpleDateFormatsdf=newSimpleDateFormat();
System.out.printf(String.format("%s办法履行结束时间:%%s;办法履行耗时:%%d%%n"
,method.getName()),sdf.format(endTime),endTime-startTime);
returninvokeObject;
}
});
returnproxyObj;
}
}
.
原文:https://www.cnblogs.com/hite/p/13278710.html
内容总结
以上是互联网集市为您收集整理的Java基础之何为动态代理?全部内容,希望文章能够帮你解决Java基础之何为动态代理?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。