Java反射技术浅谈_第1页
Java反射技术浅谈_第2页
Java反射技术浅谈_第3页
Java反射技术浅谈_第4页
Java反射技术浅谈_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、Java反射技术浅谈论文导读:反射的引入反射Reflection的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。可是这种实例化对象的方法存在一个问题,就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制。Field类:代表类的成员变量成员变量也称为类的属性。Array类:提供了动态创立数组,以及访问数组元素的静态方法。2)利用Class对象的getConstructor()方法获取指定的构造器准备一个Class作为该方法的参数类型。关键词:反射,构造器,属性,方法,数组一、引言1:反射的引入反射Reflection的概念

2、是由Smith 在1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp 和面向对象方面取得了成绩。其中LEAD/LEAD+、Open C+和Open Java 等就是基于反射机制的语言。自从1995 年问世以来,Java 一直以其面向对象的,可移植的,多线程的和动态的特点而著称,并得到了广泛的应用。严格来讲,java 并不能算纯粹的动态语言,但是Java 有着一个非常突出的动态相关机制:反射Reflection。在Java 中我们可以于运行时加载、发现、使用

3、编译期间完全未知的classes。换句话说,Java 程序可以加载一个运行时才得知名称的class,得到其完整构造但不包括methods 定义,并生成其对象实体,或对其fields 设值;或调用其methods。我们可以通过以下语句对反射有一个更清楚的认识。Person p=new Person();;这是什么?当然是实例化一个对象了。可是这种实例化对象的方法存在一个问题,就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制。那么有没有这样一种方式,让我们不知道这个类的类名就可以实例化它的对象呢?有,可以采用反射技术来实现。Class类:代表一个类。Field类:代表类的成员

4、变量成员变量也称为类的属性。免费。Method类:代表类的方法。Constructor类:代表类的构造方法。Array类:提供了动态创立数组,以及访问数组元素的静态方法。1. Class类 Java 中的Class;类是Java 中一个十分特殊的类。它和其它类一样继承自Object;类, 其对象用以表达Java程序运行时的类和接口。当一个类被加载时, JVM便自动产生一个类对象。getName():获得类的完整名字。getFields():获得类的public类型的属性。getDeclaredFields():获得类的所有属性。getMethods():获得类的public类型的方法。getD

5、eclaredMethods():获得类的所有方法。getMethod(String name, Class parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。getConstrutors():获得类的public类型的构造方法。getConstrutor(Class parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。newInstance():通过类的不带参数的构造方法创立这个类的一个对象。、Class;是Java 反射机制的起源。针对任何想探查的类,

6、只有先为它产生一个Class;对象,接下来才能由这个Class;对象调用为数十多个的反射APIs。因此, 利用反射APIs 动态访问某个类要经过以下三个步骤:(1)创立一个Class;对象;(2)利用创立的Class;对象获得类的内部信息;2. Class类举例 public static voidmain(String args) throws Exception /1、 取得某一个类的Class实例,包含着该类的元数据,有三种方法/Class clazz = String.class; /方法1/Class clazz=abc.getClass(); /方法2/2、1从Class中取出对应

7、类的全部字段,并输出其信息Fieldfields = clazz.getDeclaredFields();for(Field field : fields)/2、2从Class中取出对应类的某个字段,并输出其信息Fieldfield = clazz.getDeclaredField(count);/3、1从Class中取出对应类的全部方法,并输出其信息Methodmethods = clazz.getDeclaredMethods();for(Method meth : methods)/3、2从Class中取出对应类的某个方法,并输出其信息Methodmethod = clazz.getMe

8、thod(hashCode, new Class );/4、1 从Class中取出对应类的全部构造方法,并输出其信息Constructorconstructors = clazz.getDeclaredConstructors();for(Constructor cons : constructors) for(Type type : cons.getParameterTypes()/4、2 从Class中取出对应类的某个构造方法,并输出其信息Constructorcons = clazz.getDeclaredConstructor(new Classchar.class, int.clas

9、s, int.class );for(Type type : cons.getParameterTypes()/5、 从Class中取出对应类所在包、类的完整名、简名、父类等信息3. 取得Class实例的方法 Class Object的诞生管道 实例 运用getClass() 注:每个类都从Object类继承这个方法 String str= abc; Class c1=str.getClass(); 运用.class语法 运用static method Class.forName() 最常被使用 运用根本数据类型的包装类的TYPE语法 Class c6=Integer.TYPE; Class

10、c7=Double.TYPE; 1. 运行时生成类的实例通过反射生成对象有如下两种方式:1通过Class的newInstance()方法使用Class对象的newInstance()方法来创立该Class对象对应类的实例,这种方法要求该Class对象的对应类有无参构造方法,而执行newInstance()实际上就是执行无参构造方法来创立该类的实例。/相当于语句:Student stu=new Student();此种方法比拟常用,因为在很多JavaEE框架中都需要根据配置文件信息来创立Java对象,从配置文件读取的只是某个类的字符串类名,程序就需要根据该字符串来创立对应的实例,此时必须使用反射

11、。2通过Constructor的newInstance()方法先使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法来创立该Class对象对应类的实例。通过这种方法可以选择使用某个类的指定构造方法来创立实例。/针对有参构造方法,相当于:Student stu=new Student(lkl,32,56.5f);Constructorcons=clazz.getConstructor(new ClassString.class,int.class,float.class);Objectobj=cons.newInstance(n

12、ew Objectlkl,32,56.5f);/针对无参构造方法,相当于语句:Student stu=new Student();obj=clazz.getConstructor(newClass).newInstance(new Object);obj=clazz.getConstructor().newInstance();从以上代码中可以看出,采用第二种方法创立类的实例需要如下三个步骤:1)获取该类的Class对象。2)利用Class对象的getConstructor()方法获取指定的构造器准备一个Class作为该方法的参数类型。3)调用Constructor的newInstance()

13、方法来创立相应类的对象准备一个Object 作为该方法的实参值。2. 运行时变更与调用field值通过Class对象的getFields()或者getField()方法可以获得该类所包括的全部Field属性或指定Field属性。Field提供了以下两组方法来访问属性。getXxx(Object obj):获取obj对象该Field的属性值。此处的Xxx对应8个根本数据类型,如果该属性类型是引用类型那么直接使用get(Object obj)。setXxx(Object obj,Xxxval):将obj对象的该Field设置成val值。此处的Xxx对应8个根本数据类型,如果该属性类型是引用类型那么

14、直接使用set(Object obj,Object val)。setAccessible(Boolean flag):Field类从父类AccessibleObject中继承的方法。假设flag为true,那么取消属性的访问权限控制,即使private属性也可以进行访问;假设flag为false,那么取消属性的访问权限控制,private属性也可以进行访问。/调用getDeclaredField(name)方法取得name属性对应的Field对象。Fieldf=clazz.getDeclaredField(name);/取消属性的访问权限控制,即使private属性也可以进行访问。f.setA

15、ccessible(true);/调用get()方法获取并输出对应属性值。/调用set()方法给对应属性赋值。f.set(obj,lkl);/调用get()方法获取并输出对应属性修改后的值。3. 运行时调用method通过Class对象的getMethods()或者getMethod()方法可以获得该类所包括的全部方法或指定方法,这两个方法的返回值是Method或者Method。每个Method对象对应一个方法,获得Method对象后,就可以调用它的invoke()方法来调用对应方法。Object invoke(Objectobj,Object args):obj代表当前方法所属的对象的名字,

16、args代表当前方法的参数列表,返回值Object是当前方法的返回值,即执行当前方法的结果。public classInvokeMethod publicint add(int x, int y) returnx + y;publicvoid shout(String name) publicstatic void main(String args) throws Exception /创立该类的一个对象Classclazz = InvokeMethod.class;Objectobj = clazz.newInstance();/调用该对象的add方法Methodamethod = claz

17、z.getMethod(add, new Classint.class,int.class );Objectresult = amethod.invoke(obj, new Object 5, 7 );/调用该对象的shout方法Methodsmethod = clazz.getMethod(shout, new Class String.class );smethod.invoke(obj,new Object lkl );/以上语句作用相当于直接执行如下语句/InvokeMethod im=new InvokeMethod();/int sum=im.add(5, 7);/im.shout

18、(lkl);Array提供的主要方法如下:static ObjectnewInstance(Class componentType, int dimensions) :创立一个具有指定的组件类型和维度的新数组。static xxx getXxx(Objectarray, int index):以 xxx形式返回指定数组对象array中第index个元素的值。其中xxx代表八个根本数据类型。如果元素类型是引用类型,那么直接使用static Object get(Object array, int index)方法。static void setXxx(Objectarray, int index

19、 ,xxx val):给数组对象array中第index个元素赋值val。其中xxx代表八个根本数据类型。如果元素类型是引用类型,那么直接使用static void set(Objectarray, int index ,Object val)方法。public class ArrayTest publicstatic void main(String args) throws Exception /创立一个含有10个元素的整型数组Objectarr = Array.newInstance(clazz, 10);/给第五个元素赋值Array.set(arr,5, 20);/取出第五个元素值并输

20、出Objectelem = Array.get(arr, 5);/以上语句相当于执行如下语句/int arr=new int;/arr【5】=20;四、反射的优点和缺点反射是提高Java程序的灵活性和可扩展性至关重要的技术,它使得Java软件系统具有自适应能力,实现程序的动态演进。它提供一种动态链接程序组件的多功能方法,允许程序创立和控制任何类的对象(根据平安性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创立以非常普通方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java 反射非常有用, 如软件测试、JavaBean、EJB等, 它使类和数据结构能按名称动态检索相关信息, 并允许在运行着的程序中操作这些信息。Java这一特性非常强大, 并且是其它一些常用语言, 如C、C+、Fortran 等都不具备的。充分开掘Java 中的这一特性, 可以编写出灵活、低耦合、高重用的组件。目前许多流行的开源框架例如Stru

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论