Spring的反射机制和依赖注入_第1页
Spring的反射机制和依赖注入_第2页
Spring的反射机制和依赖注入_第3页
Spring的反射机制和依赖注入_第4页
Spring的反射机制和依赖注入_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论