`

浅谈java中的代理+即将工作一年感想

 
阅读更多

还有20天 ,就工作一年了,感觉时间过得真快,当然有的时候也会觉得时间过得很慢,当然觉得慢的时候是觉得怎么离发工资还有那么久的时间,回顾这一年的时间,从刚开始的生手到现在得到一个技术牛人的认可,经历了很多。当然,能让自己进步唯有学习。。自己本身非常喜欢技术,不是很喜欢管理,觉得管理人员的事比较多,比较杂,比较费心、劳心,所以以后还是想走技术路线,争取早日实现自己的一个目标-成为架构师。废话不多说了,今天就来说说代理--proxy

java中的代理按照代理类的生成时期不同分为静态代理和动态代理。

1)静态代理。由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。下面是静态代理的UML图。

 

具体的代码如下

1.	interface Subject  
2.	{  
3.	    void request();  
4.	}  
5.	class RealSubject implements Subject  
6.	{  
7.	    public void request()  
8.	    {  
9.	        System.out.println("真实的请求");  
10.	    }  
11.	}  
12.	public class Proxy implements Subject  
13.	{  
14.	    RealSubject realSubject;  
15.	    public void request()  
16.	    {  
17.	        if(realSubject==null)  
18.	        {  
19.	            realSubject=new RealSubject();  
20.	        }  
21.	        realSubject.request();  
22.	    }  
23.	      
24.	    public static void main(String[] args) {  
25.	        new Proxy().request();  
26.	    }  
27.	}  

 

2动态代理。动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性。想必做java web开发的,会经常用到Spring,而Spring2大核心之一是Spring AOP,Spring AOP就是利用动态代理实的(Spring利用动态代理技术实现的最重要的一个功能就是声明式事务)。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。那么接下来就利用动态代理实现上面的例子

1.	import java.lang.reflect.InvocationHandler;  
2.	import java.lang.reflect.Method;  
3.	import java.lang.reflect.Proxy;  
4.	  
5.	interface Subject {  
6.	    void request();  
7.	}  
8.	  
9.	class RealSubject implements Subject {  
10.	    public void request() {  
11.	        System.out.println("真实的请求");  
12.	    }  
13.	}  
14.	  
15.	public class DynProxy implements InvocationHandler {  
16.	  
17.	    private Object dele;  
18.	  
19.	    public DynProxy(Object obj) {  
20.	        this.dele = obj;  
21.	    }  
22.	  
23.	    public Object invoke(Object proxy, Method method, Object[] args)  
24.	            throws Throwable {  
25.	        doBefore();  
26.	        // 在这里完全可以把下面这句注释掉,而做一些其它的事情  
27.	        Object result = method.invoke(dele, args);  
28.	        after();  
29.	        return result;  
30.	    }  
31.	  
32.	    private void doBefore() {  
33.	        System.out.println("before....");  
34.	    }  
35.	  
36.	    private void after() {  
37.	        System.out.println("after....");  
38.	    }  
39.	  
40.	    public static void main(String[] args) {  
41.	        RealSubject realSubject= new RealSubject();  
42.	        DynProxy dynProxy= new DynProxy(realSubject);  
43.	        Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), dynProxy);  
44.	        subject.request();  
45.	    }  
46.	} 

 

这是JDK的动态代理,JDK的自动代理只能对接口实现自动代理,从代码当中也可以看出来realSubject.getClass().getInterfaces().JDK动态对接口进行实现,实现的方法是个空方法,那么动态代理又是怎么调用的realSubject相对应的实现方法呢,答案就是InvocationHandler,它关联了实现类,在上面的例子中也就是realSubject,它会调用realSubject相对应的实现方法。

 

 JDK的动态代理有一个特别明显的不足,即只能对接口实现动态代理。cglibCode Generation Library)的出现则弥补了JDK代理的不足,cglib能够实现对类进行动态代理。下面就用cglib来实现上面的例子。
 

1.	import java.lang.reflect.Method;  
2.	import net.sf.cglib.proxy.Enhancer;  
3.	import net.sf.cglib.proxy.MethodInterceptor;  
4.	import net.sf.cglib.proxy.MethodProxy;  
5.	  
6.	class RealSubject {  
7.	    public void request() {  
8.	        System.out.println("真实的请求");  
9.	    }  
10.	        private void privateExample(){  
11.	                 System.out.println("这个是私有方法不能被子类继承");  
12.	        }  
13.	          
14.	}  
15.	  
16.	public class MyMethodInterceptor implements MethodInterceptor {  
17.	  
18.	    public Object intercept(Object object, Method method, Object[] args,  
19.	            MethodProxy methodProxy) throws Throwable {  
20.	        System.out.println(">>>MethodInterceptor start...");  
21.	        Object result = methodProxy.invokeSuper(object, args);  
22.	        System.out.println(">>>MethodInterceptor ending...");  
23.	        return "hahahh";  
24.	    }  
25.	  
26.	    public Object createProxy(Class targetClass) {  
27.	        Enhancer enhancer = new Enhancer();  
28.	        enhancer.setSuperclass(targetClass);  
29.	        enhancer.setCallback(new MyMethodInterceptor());  
30.	        return enhancer.create();  
31.	    }  
32.	  
33.	    public static void main(String[] args) {  
34.	        RealSubject target = new RealSubject();  
35.	        MyMethodInterceptor test = new MyMethodInterceptor();  
36.	        RealSubject proxyTarget = (RealSubject)test.createProxy(RealSubject.class);  
37.	        proxyTarget.request();  
38.	    }  
39.	}  

 

 cglib能实现对类的动态代理,产生的动态代理类是原始类,在上面的例子就是RealSubject的子类,那么又跑回到了java继承体系当中了,private方法 final方法是不能被子类继承和override的,所以这些方法是不会被动态代理的。像上面的方法privateExample(),就不会出现在main函数中的proxyTarget的方法列表中。

JDK动态代理和cglib动态代理的区别

1JDK动态代理只能对接口实现动态代理,而cglib能对类实现动态代理

2JDK动态代理生成动态代理类的速度或者说效率要比cglib快,但是生成后的动态代理类的效率则是cglib高,一般会高十倍以上,所以如果在Spring中使用动态代理,而Spring中的实例一般都是单例的,所以在Spring中生成动态代理类实例一般选用cglib比较好。这样生成的动态代理类的实例效率高。

闲扯几句:一般类的信息、常量信息会放在jvm内存中的方法区或者说是永久区,如果生成动态代理类过多的话,该区被占用的也就越多,有可能导致该区域的内存溢出(只是有可能,现实当中出现的几率非常小,就顺嘴提一句)。

  • 大小: 41.4 KB
6
9
分享到:
评论
13 楼 haoran_10 2013-07-25  
知识概括的比较全面了,
12 楼 牛奶123 2013-07-12  
状态很好!继续保持!
11 楼 Shen.Yiyang 2013-07-11  
kjmmlzq19851226 写道
  补充一下楼主的闲扯几句 permgen space在运行时不会gc,所以说会导致内存溢出,判断条件就是permgen space的占用大小是否已经超过了jvm的maxpermsize。那什么情况是最容易导致内存溢出呢?个人觉得热部署很有希望成为这个始作俑者,如果在重新部署时不删除原来的class那么就会造成permgen space一直增大,最终到达jvm的maxpermsize从而溢出。

这种情况,如果能选择模块化技术,就方便多了,不然自己处理调优非常麻烦。
10 楼 bluend1004 2013-07-09  
挺好的,不过纠正一点,常量进本会放在栈里,生命周期短,读取方便;编译后或者动态代理生成的类信息会放在永久区中,如果满了,的确会引起full gc,当然咱可以通过jvm调优来尽力避免这一情况的发生!
9 楼 ddlgyq 2013-07-08  
lvwenwen 写道
工作一年,就成技术牛人了?发生什么了,让你成长这么快?

我不是技术牛人,只是得到牛人的认可,我自己离牛人还差的远呢
8 楼 lvwenwen 2013-07-08  
工作一年,就成技术牛人了?发生什么了,让你成长这么快?
7 楼 ddlgyq 2013-07-08  
求求你帮帮我 写道
工作一年,就成技术牛人了?发生什么了,让你成长这么快?

我不是牛人,还差的远呢 只不过牛人对我的进步表示了赞同
6 楼 kjmmlzq19851226 2013-07-08  
  补充一下楼主的闲扯几句 permgen space在运行时不会gc,所以说会导致内存溢出,判断条件就是permgen space的占用大小是否已经超过了jvm的maxpermsize。那什么情况是最容易导致内存溢出呢?个人觉得热部署很有希望成为这个始作俑者,如果在重新部署时不删除原来的class那么就会造成permgen space一直增大,最终到达jvm的maxpermsize从而溢出。
5 楼 求求你帮帮我 2013-07-08  
工作一年,就成技术牛人了?发生什么了,让你成长这么快?
4 楼 ddlgyq 2013-07-08  
jinnianshilongnian 写道
加油    

谢谢~共勉
3 楼 jinnianshilongnian 2013-07-08  
加油    
2 楼 ddlgyq 2013-07-08  
rlplyyrb 写道
激情能持续多久呢?

不知道,目前还是蛮有激情的,努力坚持吧
1 楼 rlplyyrb 2013-07-08  
激情能持续多久呢?

相关推荐

    追究海尔这一年-海尔工作一年后的感想所写原文 word 版

    **企业文化的重要性:** 在海尔工作一年的经历中,提到了新员工入职时进行的企业文化培训。这对于一家企业来说至关重要。企业文化不仅能够增强员工对公司的认同感和归属感,还能够有效地提升团队协作能力,使员工...

    对Java程序设计的感想.doc

    Java 程序设计不仅是学习一门编程语言,更是一...无论是为了找到高薪的工作还是为了提升自己的技术水平,投入时间去掌握 Java 都是一项值得的投资。在面对挑战时,保持积极的心态,相信自己,坚持努力,终将收获满满。

    “互联网+”背景下大学生创新创业工作的感想.pdf

    “互联网+”背景下大学生创新创业工作的感想.pdf“互联网+”背景下大学生创新创业工作的感想.pdf“互联网+”背景下大学生创新创业工作的感想.pdf“互联网+”背景下大学生创新创业工作的感想.pdf“互联网+”背景下大...

    “互联网+”背景下大学生创新创业工作的感想.docx

    “互联网+”背景下大学生创新创业工作的感想.docx“互联网+”背景下大学生创新创业工作的感想.docx“互联网+”背景下大学生创新创业工作的感想.docx“互联网+”背景下大学生创新创业工作的感想.docx“互联网+”背景...

    李兴华老师学习java的感想

    Java倡导“一次编写,到处运行”的原则,这要求我们了解JVM(Java虚拟机)的工作原理。同时,他还强调了面向对象编程(OOP)的重要性,如封装、继承、多态等概念,这些都是Java的核心特性,对于提升代码复用性和可...

    基于Java+SpringBoot的流浪动物救助网站毕业设计(源码+说明+演示视频).zip

    在圈子信息框中,用户可以发布信息,即在生活中所看见的关于动物的状况等,可发布之间的感想以及救助动物的今后的生活分享等等; 在志愿者中,用户填写完个人信息以及表明志愿工作内容,和志愿工作时间,同时可以...

    JAVA与数据库实训项目实习感想心得体会9篇范文

    在进行JAVA与数据库实训项目的过程中,我们不仅学习了理论知识,更重要的是获得了实践操作的宝贵经验。这九篇范文正是这种实践经验的结晶,涵盖了不同阶段、不同层面的学习感悟。每一篇都承载着作者对技术理解的深入...

    Java实习周报通用25篇

    这一阶段,他们熟悉了工作环境和Java编程的环境配置,强调了“多看、多问、多观察、多思考”的学习态度。 第二周,实习生专注于Java的基础语法学习,如类之间的关系(关联、聚合、继承、实现和多态),基本数据类型...

    浅谈对《计算机应用基础》教学的感想.doc

    浅谈对《计算机应用基础》教学的感想 摘要:针对计算机文化基础课程改革实践中存在的某些问题,文章总结了在课程体系、 教学内容、教学方法、教学手段及教学模式等试点实践方面的经验,在一定范围推广实践 表明,取得...

    2022年网络安全教育心得体会+网络安全教育感想(安全认识的心得体会).docx

    网络的普及带来了无数便利,如高效的工作协同、丰富的信息获取、快捷的通讯方式等。然而,随之而来的是各种网络安全问题,包括个人信息泄露、网络欺诈、不良信息传播、网络犯罪等,这些问题对青少年的影响尤为显著。...

    Java毕业设计-基于springboot的流浪动物救助网站(源码+演示视频).zip

    在圈子信息框中,用户可以发布信息,即在生活中所看见的关于动物的状况等,可发布之间的感想以及救助动物的今后的生活分享等等; 在志愿者中,用户填写完个人信息以及表明志愿工作内容,和志愿工作时间,同时可以...

    小学四年级元旦主题班会新的一年新的开始.pptx

    在我们的班会中,我们鼓励同学们分享过去一年的感想和回忆。每位同学都分享了自己一年来的成长和进步,以及在学习和生活中遇到的挑战和收获。通过这些真实的分享,我们不仅增进了彼此的理解,也激发了同学们对未来的...

    对JAVA程序设计的感想.pdf

    标题和描述中提到的文件名为《对JAVA程序设计的感想.pdf》,表明本文档应当是关于作者对于Java程序设计的学习体会和感受。由于文件内容是由OCR扫描技术转录的部分文字,出现了重复、乱码和格式错误,但可以从中提炼...

    公司员工工作感想总结.doc

    【公司员工工作感想总结】 在过去的___年中,我作为一名公司员工,经历了从生产休假回归工作岗位的过程。在这半年的时间里,我在公司的引导和支持下,不断提升自我,全力以赴地完成了各项任务,为公司的发展做出了...

    员工年度工作感想总结模板.doc

    作为一名员工,回顾过去一年的工作历程,我深感收获与不足并存。在此,我愿意通过这篇文章,与大家分享我的工作感想和总结,希望能够激励自己以及同事们的前行。 **自我反思与成长** 首先,自我反思是个人成长的...

    最近课程设计——JAVA连连看

    好东西大家分享——JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看

    宣传部工作感想3篇_1 .docx

    6. **成长与适应**:在宣传部工作一年后的感想,表达了个人在不断磨砺中适应学生会生活的过程,以及在工作中体验到的辛酸与快乐,这些经历对于个人的成长具有重要意义。 7. **工作原则与集体行动**:学生会工作原则...

    2021员工岗位工作感想总结.doc

    在2021年的工作中,作为一名员工,我深刻体会到时间的流逝,一学年的工作即将结束。这一年的工作既繁忙又充满挑战,但我在校领导和同事们的协助下,成功地完成了各项任务,实现了个人的成长和提升。我注重调动学生的...

    员工个人年度工作感想总结.doc

    在过去的这一年中,我作为企业的一名员工,深感荣幸能够参与到公司的...面对即将到来的新一年,我满怀信心,期待在新的一年中,通过不断学习和工作实践,能够为公司贡献更大的力量,并实现个人职业生涯的进一步发展。

    基于Simulink的永磁同步电机实验仿真文件+结果分析+电机课程感想

    在这个项目中,通过对伺服电机的仿真和分析,研究者可以深入理解其内部工作机制,并探索提升电机控制精度和系统稳定性的方法。 总之,通过这个包含Simulink模型、实验步骤、结果分析以及电机课程感想的综合项目,...

Global site tag (gtag.js) - Google Analytics