版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Spring的反射机制和依赖注入我们知道Spring大量使用了反射机制,那么究竟是什么地方使用了呢?prin的大核心概念是注入,但是,这存在的一个前提就是类是由prin管理起来的。反射是根据生成一个具体的实例,这是个很实用的思想。比如:当我们需要根据传进来的参数的类型,选择具体的实现类时,反射机制就能很好的解决问题。然而,一般我们使用反射机制,创建的代理类是根据构造函数实例化的。而不是从prin容器中注入。这样就会导致一个问题,无法在创建的代理类中实现注入功能。当然,如果你一定要使用的话,系统会提示空指针错误。这个时候,如果把反射创建的类由prin注入就可以有效的解决这个问题。这样也存在一个问
2、题。就是获得prin的ppiinn如果我们重新获得一遍的话,这样就是对系统资源极大的浪费。这样我们可以声明一个静态变量将ppiin保存起来声明一个静态变量保存piippiinnppiinnnrnpinppiinninn并将其用prin容器管理起来。这样的话,我们就可以很轻松的获得ppiin,而不需要消耗太多的系统资源。从而,很简单的,当我们的实现类全部继承一个相同的接口时,我们的接口便可以通过反射初始化。从而,创建不同的具体实现类。同时,因为所有的类都是通过prin管理起来的。很明显,在创建的实现类中也是可以使用prin的注入。而不是有空指针错误。反射源头类对类的概念我们已经非常熟悉了。比如可
3、以有S这个类,r这个类。但是我们要知道,有一个叫的类,它是反射的源头。正常方式:通过完整的类名通过n实例化取得实例化对象反射方式:实例化对象g方法通过完整的类名一个简单的例子:packagecn.classes;publicclassOneClasspackagecn.test;importcn.classes.OneClass;publicclassTestpublicstaticvoidmain(Stringargs)OneClassc=newOneClass();System.out.println(c.getClass().getName();输出结果:cn.classes.OneCl
4、ass我们需要使用反射,就要获得Class这个类,有三种方法:packagecn.classes;publicclassOneClassimportcn.classes.OneClass;publicclassTestpublicstaticvoidmain(Stringargs)Class<?>c1=null;Class<?>c2=null;Class<?>c3=null;try/方法一:forName(重要)c1=Class.forName("cn.classes.OneClass");catch(ClassNotFoundExcep
5、tione)e.printStackTrace();/方法二c2=newOneClass().getClass();/方法三c3=OneClass.class;System.out.println(c1.getName();System.out.println(c2.getName();System.out.println(c3.getName();输出结果:cn.classes.OneClass二利用Class这个类实例化类无参构造packagecn.classes;publicclassPersonprivateStringname;privateintage;省略getter,sette
6、rOverridepublicStringtoString()return"Personname="+name+",age="+age+""p.setName("xy");Personp=packagecn.test;importcn.classes.Person;publicclassTest/这样做必须在类中有一个空构造方法publicstaticvoidmain(Stringargs)Class<?>c=null;tryc=Class.forName("cn.classes.Person
7、");Personp=(Person)c.newInstance();p.setAge(20);System.out.println(p);catch(Exceptione)e.printStackTrace();有参构造packagecn.classes;publicclassPersonprivateStringname;privateintage;省略getter,setterOverridepublicStringtoString()return"Personname="+name+",age="+age+""pac
8、kagecn.test;importjava.lang.reflect.Constructor;importcn.classes.Person;publicclassTest/如果没有一个空构造方法publicstaticvoidmain(Stringargs)Class<?>c=null;tryc=Class.forName("cn.classes.Person");Constructor<?>cons=c.getConstructors();(Person)cons0.newInstance("xy",20);System.o
9、ut.println(p);catch(Exceptione)e.printStackTrace();三Spring中使用Class实例化bean.xml<beanid="id"class="com.xy.Student"/>Spring将采用的代码创建代码Java实例Classc=Class.forName("com.xy.Student");Objectbean=c.newInstance();四Class类调用方法packagecn.classes;publicclassPersonpublicvoidadd()Sy
10、stem.out.println("add");publicvoidaddWithParameters(Stringname,intage)System.out.println("add带参数方法"+name+age);packagecn.test;importjava.lang.reflect.Method;publicclassTestpublicstaticvoidmain(Stringargs)Class<?>c1=null;tryc1=Class.forName("cn.classes.Person");/不带参
11、数的方法调用Methodm=c1.getMethod("add");m.invoke(c1.newInstance();/带参数方法调用Methodm1=c1.getMethod("addWithParameters",String.class,int.class);m1.invoke(c1.newInstance(),"xy",22);catch(Exceptione)e.printStackTrace();五Class获得getter,setter方法Class这个类可以获得类的很多信息,比如获得该类的接口,构造函数,属性,方法等
12、。我们来看如何获fetter,setter方法。packagecn.classes;publicclassPersonprivateStringname;privateintage;省略getter,setterpackagecn.test;importjava.lang.reflect.Method;publicclassTestpublicstaticvoidmain(Stringargs)Class<?>c1=null;Objectobj=null;tryc1=Class.forName("cn.classes.Person");obj=c1.newIns
13、tance();setter(obj,"name","xy",String.class);setter(obj,"age",20,int.class);getter(obj,"name");getter(obj,"age");catch(Exceptione)e.printStackTrace();/* paramobj:要操作的对象* paramatt:要操作的属性* paramvalue:要设置的属性内容* paramtype:要设置的属性类型*/publicstaticvoidsetter
14、(Objectobj,Stringatt,Objectvalue,Class<?>type)try/得到setter方法Methodm=obj.getClass().getMethod("set"+initStr(att),type);m.invoke(obj,value);catch(Exceptione)e.printStackTrace();/* paramobj:要操作的对象* paramatt:要操作的属性*/publicstaticvoidgetter(Objectobj,Stringatt)try/得到getter方法Methodm=obj.get
15、Class().getMethod("get"+initStr(att);System.out.println(m.invoke(obj);catch(Exceptione)e.printStackTrace();publicstaticStringinitStr(StringoldStr)StringnewStr=oldStr.substring(0,1).toUpperCase()+oldStr.substring(1);returnnewStr;六Spring调用getter,setter方法我们以setter注入例子bean.xml<beanid="id"class="com.xy.Student"><propertyname="stuName"value="xy"/></bean>Spring将采用的代码创建代码Java实例,并注入值:Classc=Class.forName("com.xy.Student");Objectbean=c.newInstance();通过一些操作获取对stuName
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 零售行业市场研究及消费习惯与投资布局研究报告
- 中国高跟鞋行业消费规模预测与前景销售格局分析研究报告
- 2025-2030光通信模块技术迭代与数据中心需求增长关联研究
- 感恩之心温暖你我小学主题班会课件
- 家长会班会:加强家校沟通
- 配件采购紧急通知函8篇范本
- 斜拉桥拉索更换施工方案及技术措施
- 北京未来城主厂房给排水消防及采暖通风与空调工程施工方案
- 2026年银行从业资格理论考试试卷及答案
- 小学主题班会课件:网络生活健康安全
- 航天科工集团在线测评题真题
- 2026年内蒙古自治区呼和浩特市初二学业水平地理生物会考试题题库(答案+解析)
- 人教版六年级下册数学思维拓展题型专项练习(含答案)
- 服务临床一线工作制度
- 产后专科工作制度
- 2026年英国a-level考试试题
- 有限空间作业监理实施细则
- 学校延时服务奖惩制度
- 投资分析师金融行业绩效考评表
- 肺癌早筛早诊课件
- 卫生院学术期刊预警制度
评论
0/150
提交评论