2024年10月java反射怎么实现的(java反射机制详解)

 更新时间:2024-10-12

  ⑴java反射怎么实现的(java反射机制详解

  ⑵java反射机制详解

  ⑶反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private,由JVM创建。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和方法并且显示出来。Java的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C或者C++中就没有办法在程序中获得函数定义相关的信息。(来自SunJavaBean是reflection的实际应用之一,它能让一些工具可视化的操作软件组件。这些工具通过reflection动态的载入并取得Java组件(类)的属性。反射是从.就有的,后面的三大框架都会用到反射机制,涉及到类“Class“,无法直接newCLass(),其对象是内存里的一份字节码.Class类的实例表示正在运行的Java应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为Class对象的一个类,所有具有相同元素类型和维数的数组都共享该Class对象。基本的Java类型(boolean、byte、char、short、int、long、float和double和关键字void也表示为Class对象。Class没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。Personp=newPerson();//下面的这三种方式都可以得到字节码CLassc=Date.class();p.getClass();//若存在则加载,否则新建,往往使用第三种,类的名字在写源程序时不需要知道,到运行时再传递过来Class.forName(“java.lang.String“);Class.forName()字节码已经加载到java虚拟机中,去得到字节码;java虚拟机中还没有生成字节码用类加载器进行加载,加载的字节码缓冲到虚拟机中。另外,大家可以关注微信公众号Java技术栈回复:JVM,获取我整理的系列JVM教程,都是干货。考虑下面这个简单的例子,让我们看看reflection是如何工作的。importjava.lang.reflect.*;publilassDumpMethods{publicstaticvoidmain(Stringargs){try{Classc=Class.forName(“java.util.Stack“);Methodm=c.getDeclaredMethods();for(inti=;i《m.length;i++)System.out.println(m.toString());}catch(Throwablee){System.err.println(e);}}}publicsynchronizedjava.lang.Objectjava.util.Stack.pop()publicjava.lang.Objectjava.util.Stack.push(java.lang.Object)publicbooleanjava.util.Stack.empty()publicsynchronizedjava.lang.Objectjava.util.Stack.peek()publicsynchronizedintjava.util.Stack.search(java.lang.Object)这样就列出了java.util.Stack类的各方法名以及它们的限制符和返回类型。这个程序使用Class.forName载入指定的类,然后调用getDeclaredMethods来获取这个类中定义了的方法列表。java.lang.reflect.Methods是用来描述某个类中单个方法的一个类。以下示例使用Class对象来显示对象的类名:voidprintClassName(Objectobj){System.out.println(“Theclassof“+obj+“is“+obj.getClass().getName());}还可以使用一个类字面值(JLSSection..来获取指定类型(或void的Class对象。例如:System.out.println(“ThenameofclassFoois:“+Foo.class.getName());在没有对象实例的时候,主要有两种办法。//获得类类型的两种方式Classcls=Role.class;Classcls=Class.forName(“yui.Role“);注意第二种方式中,forName中的参数一定是完整的类名(包名+类名,并且这个方法需要捕获异常。现在得到cls就可以创建一个Role类的实例了,利用Class的newInstance方法相当于调用类的默认的构造器。Objecto=cls.newInstance();//创建一个实例//Objecto=newRole();//与上面的方法等价

  ⑷反射在java底层是怎样实现的

  ⑸java的类装载系统:在java虚拟机中有两种类装载器:启动类装载器和自定义类装载器。前者是jvm的一部分,后者是java程序的一部分。不同的类装载器放在不懂得命名空间中。类转载子系统涉及java的其它几个部分,及来自lang库的类。比如自定义的类装载器必须派生自java.lang.ClassLoader。ClassLoader中定义的方法为程序提供了访问类装载器机制的接口。其实在java内置的类装载器有三种。BootstrapClassLoader此加载器采用c++编写,一般开发中很少见。ExtensionClassLoader用来进行扩展类的加载,一般对应的是jrelibext目录中的类AppClassLoader加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。工作流程装载:查找并装载类型的二进制数据。链接:验证准备解析初始化:把类变量初始化为正确的初始值。类的ClassLoader的protectedfinalClassfindSystemClass(Stringname;接受一个字符串作为参数,.反射射就是一面镜子能够在镜子中看到这个类中的逗所有地的东西有三种可以在程序中得到class对象的方式:第一中就是在编译时不知道其类名但在运行期可以得到该类名使用class类的forname(静态方法获得class对象如:classc=class.forname(“得到的类名的全名包括属于的工程,包“);第二中就是当我们得到该类的一个对象我们就可以直接用该对象的getclass();方法得到给类的class对象如:classc=对象名.getclass();第三种就是我们在运行前就已经知道其类名的可以直接使用类名.class来得到一个给类的class对象如:classc=类名.class;.反射装载过程:除了系统类,扩展库和classpath的自定义的装载,java还支持动态扩展,包括运行时决定使用的类型,装载,使用它们。通过反射的java.lang.Class的forName(方法,或者用户自定义的loadClass(方法,都可以自动扩展java程序。对于Class。forName(来讲主要有两种形式:statilass《?》forName(StringclassName)ReturnstheClassobjectassociatedwiththeclassorinterfacewiththegivenstringname.statilass《?》forName(Stringname,booleaninitialize,ClassLoaderloader)ReturnstheClassobjectassociatedwiththeclassorinterfacewiththegivenstringname,usingthegivenclassloader.三参数的解释如果initalize设为true,类型会在forName(方法返回前连接并初始化;如果是false,类型会被加载,可能会连接但是不会被明确的初始化。如果loader为null则使用默认的加载器,也可以选用自定义的加载器。两个forName(方法都返回Class实例的引用,代表被装载的类型。如果不能装载抛出ClassNotFoundException。如果使用用户自定义的装载器,那么loadClass(方法就要调用Class《?》loadClass(Stringname)Loadstheclasswiththespecifiedbinaryname.protectedClass《?》loadClass(Stringname,booleanresolve)Loadstheclasswiththespecifiedbinaryname.这两个方法来装载新的请求的类型,如果找不到,会抛出ClassNotFoundException异常。

  ⑹Java的反射机制是什么,如何实现

  ⑺Java中的反射机制,通俗点解释就是能够在程序运行中动态获取到内存中任一对象的信息,这些信息包括对象所属类、类中的方法和属性、以及它们的访问控制域和返回值类型等等,还可以通过反射动态调用对象中的方法,而不管该方法的访问域是私有或是公开,包括构造方法,还能实现动态代理等。总之,反射能够破坏掉JAVA类本身的封装性,进而获取其私有的或公开的信息,也就能突破封装进而调用私有的或公开的方法。实现的话就是通过反射接口,JAVA把反射相关的类接口都封装在了java.lang.reflect这个包中,你可以研究下这个包中的类,对于类的每一个属性,如变量、方法,构造方法,这个包中都就与之相对应的类,通过这个类就可以操作这个属性了。java反射很强大,但也很危险,在实际开发中应少用或不用,在必要用之时,往往也能解决你遇到的问题。

  ⑻java的反射是基于怎样的原理

  ⑼java通常是先有类再有对象,有对象我就可以调用方法或者属性。反射其实是通过Class对象来调用类里面的方法。通过反射可以调用私有方法和私有属性。大部分框架都是运用反射原理

  ⑽JAVA中反射是什么

  ⑾JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。

  ⑿Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。

  ⒀Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。

  ⒁JAVA中反射实例:

  ⒂ClasssuperClass=clazz.getSuperclass();//获取父类。

  ⒃System.out.println(“getSuperclass:“+superClass)。

  ⒄Classinterfaces=clazz.getInterfaces();//获取实现接口。

  ⒅System.out.println(“getInterfaces:“+interfaces.length)。

  ⒆Constructorcons=clazz.getConstructors();//构造方法。

  ⒇System.out.println(“getConstructors:“+cons.length)。

  ⒈参考资料来源:百度百科:JAVA反射机制

  ⒉Java里面反射的原理是什么

  ⒊Java在编译之后会生成一个class文件,反射通过字节码文件找到其类中的方法和属性等。通过反射,java可以动态的加载未知的外部配置对象,临时生成字节码进行加载使用,使代码更灵活,极大地提高应用的扩展性。其实博客会有更加详细的解释。

  ⒋Java怎么通过反射获取并实现这个类里面的接口,并且实现接口中的方法

  ⒌获取当前线程的ClassLoader,通过ClassLoader获取当前工作目录,对目录下的文件进行遍历扫描。过滤出以.class为后缀的类文件,并加载类到list中,对list中所有类进行校验,判断是否为指定接口的实现类,并排除自身。返回所有符合条件的类。

  ⒍这个方没有考虑不同的文件格式。当程序打成jar包,发布运行时,上述的这种遍历file的操作就失效了。只能扫描到当前方法的同级目录及其子目录。无法覆盖整个模块,遍历文件的逻辑太啰嗦,可以简化。

  ⒎Java使用注意事项:

  ⒏如果没有定义环境变量classpath,java启动jvm后,会在当前目录下查找要运行的类文件。

  ⒐如果指定了classpath,那么会在指定的目录下查找要运行的类文件。

  ⒑PATH环境变量。作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。

  ⒒需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。

  ⒓java反射机制的实现原理

  ⒔反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力。通过这种能力可以彻底的了解自身的情况为下一步的动作做准备。下面具体介绍一下java的反射机制。这里你将颠覆原来对java的理解。Java的反射机制的实现要借助于个类:class,Constructor,Field,Method;其中class代表的时类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组成部分。Class:程序运行时,java运行时系统会对所有的对象进行运行时类型的处理。这项信息记录了每个对象所属的类,虚拟机通常使用运行时类型信息选择正确的方法来执行(摘自:白皮书。但是这些信息我们怎么得到啊,就要借助于class类对象了啊。在Object类中定义了getClass()方法。我们可以通过这个方法获得指定对象的类对象。然后我们通过分析这个对象就可以得到我们要的信息了。比如:ArrayListarrayList;Classclazz=arrayList.getClass();然后我来处理这个对象clazz。当然了Class类具有很多的方法,这里重点将和Constructor,Field,Method类有关系的方法。Reflection是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。Java的这一能力在实际应用中也许用得不是很多,但是个人认为要想对java有个更加深入的了解还是应该掌握的。.检测类:reflection的工作机制考虑下面这个简单的例子,让我们看看reflection是如何工作的。importjava.lang.reflect.*;publilassDumpMethods{publicstaticvoidmain(Stringargs){try{Classc=Class.forName(args);Methodm=c.getDeclaredMethods();for(inti=;i《m.length;i++)System.out.println(m.toString());}catch(Throwablee){System.err.println(e);}}}按如下语句执行:javaDumpMethodsjava.util.ArrayList这个程序使用Class.forName载入指定的类,然后调用getDeclaredMethods来获取这个类中定义了的方法列表。java.lang.reflect.Methods是用来描述某个类中单个方法的一个类。Java类反射中的主要方法对于以下三类组件中的任何一类来说--构造函数、字段和方法--java.lang.Class提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以下是用于查找构造函数的一组反射调用:ConstructetConstructor(Classparams)--获得使用特殊的参数类型的公共构造函数,ConstructetConstructors()--获得类的所有公共构造函数ConstructetDeclaredConstructor(Classparams)--获得使用特定参数类型的构造函数(与接入级别无关)ConstructetDeclaredConstructors()--获得类的所有构造函数(与接入级别无关)获得字段信息的Class反射调用不同于那些用于接入构造函数的调用,在参数类型数组中使用了字段名:FieldgetField(Stringname)--获得命名的公共字段FieldgetFields()--获得类的所有公共字段FieldgetDeclaredField(Stringname)--获得类声明的命名的字段FieldgetDeclaredFields()--获得类声明的所有字段用于获得方法信息函数:MethodgetMethod(Stringname,Classparams)--使用特定的参数类型,获得命名的公共方法MethodgetMethods()--获得类的所有公共方法MethodgetDeclaredMethod(Stringname,Classparams)--使用特写的参数类型,获得类声明的命名的方法MethodgetDeclaredMethods()--获得类声明的所有方法使用Reflection:用于reflection的类,如Method,可以在java.lang.relfect包中找到。使用这些类的时候必须要遵循三个步骤:第一步是获得你想操作的类的java.lang.Class对象。在运行中的Java程序中,用java.lang.Class类来描述类和接口等。下面就是获得一个Class对象的方法之一:Classc=Class.forName(“java.lang.String“);这条语句得到一个String类的类对象。还有另一种方法,如下面的语句:Classc=int.class;或者Classc=Integer.TYPE;它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类(如Intege)中预先定义好的TYPE字段。第二步是调用诸如getDeclaredMethods的方法,以取得该类中定义的所有方法的列表。一旦取得这个信息,就可以进行第三步了——使用reflectionAPI来操作这些信息,如下面这段代码:Classc=Class.forName(“java.lang.String“);Methodm=c.getDeclaredMethods();System.out.println(m.toString());它将以文本方式打印出String中定义的第一个方法的原型。处理对象:a.创建一个Class对象b.通过getField创建一个Field对象c.调用Field.getXXX(Object)方法(XXX是Int,Float等,如果是对象就省略;Object是指实例).例如:importjava.lang.reflect.*;importjava.awt.*;classSampleGet{publicstaticvoidmain(Stringargs){Rectangler=newRectangle(,);printHeight(r);}staticvoidprintHeight(Rectangler){FieldheightField;IntegerheightValue;Classc=r.getClass();try{heightField=c.getField(“height“);heightValue=(Integer)heightField.get(r);System.out.println(“Height:“+heightValue.toString());}catch(NoSuchFieldExceptione){System.out.println(e);}catch(SecurityExceptione){System.out.println(e);}catch(IllegalAessExceptione){System.out.println(e);}}}安全性和反射:在处理反射时安全性是一个较复杂的问题。反射经常由框架型代码使用,由于这一点,我们可能希望框架能够全面接入代码,无需考虑常规的接入限制。但是,在其它情况下,不受控制的接入会带来严重的安全性风险,例如当代码在不值得信任的代码共享的环境中运行时。由于这些互相矛盾的需求,Java编程语言定义一种多级别方法来处理反射的安全性。基本模式是对反射实施与应用于源代码接入相同的限制:从任意位置到类公共组件的接入类自身外部无任何到私有组件的接入受保护和打包(缺省接入组件的有限接入不过至少有些时候,围绕这些限制还有一种简单的方法。我们可以在我们所写的类中,扩展一个普通的基本类java.lang.reflect.AessibleObject类。这个类定义了一种setAessible方法,使我们能够启动或关闭对这些类中其中一个类的实例的接入检测。唯一的问题在于如果使用了安全性管理器,它将检测正在关闭接入检测的代码是否许可了这样做。如果未许可,安全性管理器抛出一个例外。下面是一段程序,在TwoString类的一个实例上使用反射来显示安全性正在运行:publilassReflectSecurity{publicstaticvoidmain(Stringargs){try{TwoStringts=newTwoString(“a“,“b“);Fieldfield=clas.getDeclaredField(“m_s“);//field.setAessible(true);System.out.println(“Retrievedvalueis“+field.get(inst));}catch(Exceptionex){ex.printStackTrace(System.out);}}}如果我们编译这一程序时,不使用任何特定参数直接从命令行运行,它将在field.get(inst)调用中抛出一个IllegalAessException异常。如果我们不注释field.setAessible(true)代码行,那么重新编译并重新运行该代码,它将编译成功。最后,如果我们在命令行添加了JVM参数-Djava.security.manager以实现安全性管理器,它仍然将不能通过编译,除非我们定义了ReflectSecurity类的许可权限。反射性能:(转录别人的啊反射是一种强大的工具,但也存在一些不足。一个主要的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。下面的程序是字段接入性能测试的一个例子,包括基本的测试方法。每种方法测试字段接入的一种形式--aessSame与同一对象的成员字段协作,aessOther使用可直接接入的另一对象的字段,aessReflection使用可通过反射接入的另一对象的字段。在每种情况下,方法执行相同的计算--循环中简单的加/乘顺序。程序如下:publicintaessSame(intloops){m_value=;for(intindex=;index《loops;index++){m_value=(m_value+ADDITIVE_VALUE)*MULTIPLIER_VALUE;}returnm_value;}publicintaessReference(intloops){TimingClasstiming=newTimingClass();for(intindex=;index《loops;index++){timing.m_value=(timing.m_value+ADDITIVE_VALUE)*MULTIPLIER_VALUE;}returntiming.m_value;}publicintaessReflection(intloops)throwsException{TimingClasstiming=newTimingClass();try{Fieldfield=TimingClass.class.getDeclaredField(“m_value“);for(intindex=;index《loops;index++){intvalue=(field.getInt(timing)+ADDITIVE_VALUE)*MULTIPLIER_VALUE;field.setInt(timing,value);}returntiming.m_value;}catch(Exceptionex){System.out.println(“Errorusingreflection“);throwex;}}在上面的例子中,测试程序重复调用每种方法,使用一个大循环数,从而平均多次调用的时间衡量结果。平均值中不包括每种方法第一次调用的时间,因此初始化时间不是结果中的一个因素。下面的图清楚的向我们展示了每种方法字段接入的时间:图:字段接入时间:我们可以看出:在前两副图中(SunJVM),使用反射的执行时间超过使用直接接入的倍以上。通过比较,IBMJVM可能稍好一些,但反射方法仍旧需要比其它方法长倍以上的时间。任何JVM上其它两种方法之间时间方面无任何显著差异,但IBMJVM几乎比SunJVM快一倍。最有可能的是这种差异反映了SunHotSpotJVM的专业优化,它在简单基准方面表现得很糟糕。反射性能是Sun开发.JVM时关注的一个方面,它在反射方法调用结果中显示。在这类操作的性能方面,Sun..JVM显示了比..版本很大的改进。如果为为创建使用反射的对象编写了类似的计时测试程序,我们会发现这种情况下的差异不象字段和方法调用情况下那么显著。使用newInstance()调用创建一个简单的java.lang.Object实例耗用的时间大约是在Sun..JVM上使用newObject()的倍,是在IBM..JVM的四倍,只是Sun..JVM上的两部。使用Array.newInstance(type,size)创建一个数组耗用的时间是任何测试的JVM上使用newtype的两倍,随着数组大小的增加,差异逐步缩小。随着jdk.的推出,反射机制的性能也有了很大的提升。期待中….总结:Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Javareflection非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java的这一特性非常强大,并且是其它一些常用语言,如C、C++、Fortran或者Pascal等都不具备的。但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。许多应用中更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方——记录其在目标类中的使用。一下是对应各个部分的例子:具体的应用:、模仿instanceof运算符号classA{}publilassinstance{publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“A“);booleanb=cls.isInstance(newInteger());System.out.println(b);booleanb=cls.isInstance(newA());System.out.println(b);}catch(Throwablee){System.err.println(e);}}}、在类中寻找指定的方法,同时获取该方法的参数列表,例外和返回值importjava.lang.reflect.*;publilassmethod{privateintf(Objectp,intx)throwsNullPointerException{if(p==null)thrownewNullPointerException();returnx;}publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“method“);Methodmethlist=cls.getDeclaredMethods();for(inti=;i《methlist.length;i++)Methodm=methlist;System.out.println(“name=“+m.getName());System.out.println(“declclass=“+m.getDeclaringClass());Classpvec=m.getParameterTypes();for(intj=;j《pvec.length;j++)System.out.println(“param#“+j+““+pvec);Classevec=m.getExceptionTypes();for(intj=;j《evec.length;j++)System.out.println(“exc#“+j+““+evec);System.out.println(“returntype=“+m.getReturnType());System.out.println(“-----“);}}catch(Throwablee){System.err.println(e);}}}、获取类的构造函数信息,基本上与获取方法的方式相同importjava.lang.reflect.*;publilassconstructor{publionstructor(){}protectedconstructor(inti,doubled){}publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“constructor“);Constructorctorlist=cls.getDeclaredConstructors();for(inti=;i《ctorlist.length;i++){Constructorct=ctorlist;System.out.println(“name=“+ct.getName());System.out.println(“declclass=“+ct.getDeclaringClass());Classpvec=ct.getParameterTypes();for(intj=;j《pvec.length;j++)System.out.println(“param#“+j+““+pvec);Classevec=ct.getExceptionTypes();for(intj=;j《evec.length;j++)System.out.println(“exc#“+j+““+evec);System.out.println(“-----“);}}catch(Throwablee){System.err.println(e);}}}、获取类中的各个数据成员对象,包括名称。类型和访问修饰符号importjava.lang.reflect.*;publilassfield{privatedoubled;publicstaticfinalinti=;Strings=“testing“;publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“field“);Fieldfieldlist=cls.getDeclaredFields();for(inti=;i《fieldlist.length;i++){Fieldfld=fieldlist;System.out.println(“name=“+fld.getName());System.out.println(“declclass=“+fld.getDeclaringClass());System.out.println(“type=“+fld.getType());intmod=fld.getModifiers();System.out.println(“modifiers=“+Modifier.toString(mod));System.out.println(“-----“);}}catch(Throwablee){System.err.println(e);}}}、通过使用方法的名字调用方法importjava.lang.reflect.*;publilassmethod{publicintadd(inta,intb){returna+b;}publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“method“);Classpartypes;partypes=Integer.TYPE;partypes=Integer.TYPE;Methodmeth=cls.getMethod(“add“,partypes);methodmethobj=newmethod();Objectarglist;arglist=newInteger();arglist=newInteger();Objectretobj=meth.invoke(methobj,arglist);Integerretval=(Integer)retobj;System.out.println(retval.intValue());}catch(Throwablee){System.err.println(e);}}}、创建新的对象importjava.lang.reflect.*;publilassconstructor{publionstructor(){}publionstructor(inta,intb){System.out.println(“a=“+a+“b=“+b);}publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“constructor“);Classpartypes;partypes=Integer.TYPE;partypes=Integer.TYPE;Constructorct=cls.getConstructor(partypes);Objectarglist;arglist=newInteger();arglist=newInteger();Objectretobj=ct.newInstance(arglist);}catch(Throwablee){System.err.println(e);}}}、变更类实例中的数据的值importjava.lang.reflect.*;publilassfield{publicdoubled;publicstaticvoidmain(Stringargs){try{Classcls=Class.forName(“field“);Fieldfld=cls.getField(“d“);fieldfobj=newfield();System.out.println(“d=“+fobj.d);fld.setDouble(fobj,.);System.out.println(“d=“+fobj.d);}catch(Throwablee){System.err.println(e);}}}使用反射创建可重用代码:、对象工厂Objectfactory(Stringp){Classc;Objecto=null;try{c=Class.forName(p);//getclassdefo=c.newInstance();//makeanewone}catch(Exceptione){System.err.println(“Can’tmakea“+p);}returno;}publilassObjectFoundry{publicstaticObjectfactory(Stringp)throwsClassNotFoundException,InstantiationException,IllegalAessException{Classc=Class.forName(p);Objecto=c.newInstance();returno;}}、动态检测对象的身份,替代instanceofpublicstaticbooleanisKindOf(Objectobj,Stringtype)throwsClassNotFoundException{//gettheclassdefforobjandtypeClassc=obj.getClass();ClasstClass=Class.forName(type);while(c!=null){if(c==tClass)returntrue;c=c.getSuperclass();}returnfalse;}

  ⒕java课程分享Java的反射机制

  ⒖Java反射机制是一个非常强大的功能,在很多大型项目比如Spring,Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。下面java

  ⒗java中反射的三种方法是

  ⒘第一种:通过forName()方法;第二种:类.class;第三种:对象.getClass()。举例如下:packagetest;publilassDemo{publicstaticvoidmain(){Class《?》c=null;Class《?》c=null;Class《?》c=null;//三种反射用实例化方式try{//最常用的一种形式c=Class.forName(“test.X“);}catch(ClassNotFoundExceptione){e.printStackTrace();}//通过Object类中的方法实例化c=newX().getClass();//通过类.class实例化c=X.class;System.out.println(“类名:“+c.getName());//得到类名System.out.println(“类名:“+c.getName());//得到类名System.out.println(“类名:“+c.getName());//得到类名}}

您可能感兴趣的文章:

相关文章