详解java反射各种应用

上传人:第*** 文档编号:32830435 上传时间:2018-02-12 格式:DOC 页数:10 大小:58.50KB
返回 下载 相关 举报
详解java反射各种应用_第1页
第1页 / 共10页
详解java反射各种应用_第2页
第2页 / 共10页
详解java反射各种应用_第3页
第3页 / 共10页
详解java反射各种应用_第4页
第4页 / 共10页
详解java反射各种应用_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《详解java反射各种应用》由会员分享,可在线阅读,更多相关《详解java反射各种应用(10页珍藏版)》请在金锄头文库上搜索。

1、详解 Java 反射各种应用Java 除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息。通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容:Class 对象构造器变量方法私有变量与私有方法注解泛型数组本文也将从上面几个方面来介绍 Java 反射。本文涉及的所有代码均在反射代码首先放出一个 Java 类作为反射的研究对象,类的内容如下:public abstract class FatherObject implements Runnablepublic void doSomething()System.out.println(做事情.);p

2、ublic class ExampleObject extends FatherObjectpublic int age = 30;public String name = byhieg;private Integer score = 60;public void printName()System.out.println(name);public int getAge() return age;public void setAge(int age) this.age = age;public String getName() return name;public void setName(S

3、tring name) this.name = name; public Integer getScore() return score;public void setScore(Integer score) this.score = score;public ExampleObject()public ExampleObject(String name)public ExampleObject(int age,Integer score)Overridepublic void doSomething() super.doSomething();Overridepublic void run(

4、) System.out.println(run.);Class 对象我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作。那么,首先无疑就是得到类的信息,在 JDK 中提供了 Class 对象来保存类的信息。所以,反射的第一步就是得到 Class 对象。在 JDK 中提供了两种方式得到 Class 对象。第一种,如果编写代码的时候,就知道 Class 的名字,可以直接用如下方式得到 Class 对象:Class exampleObjectClass = ExampleObject.class;第二种,如果在编写代码的时候,不知道类的名字,但是在运行

5、时的时候,可以得到一个类名的字符串,可以用如下的方式获取 Class 对象:Class exampleObjectClass = Class.forName(cn.byhieg.reflectiontutorial.ExampleObject);注意,此方法需要有 2 个条件,第一, forName 中的字符串必须是全限定名,第二,这个 Class 类必须在 classpath 的路径下面,因为该方法会抛出 ClassNotFoundException 的异常。获取到这个 Class 对象之后,就可以得到类的各种信息,开头已经提及了一些信息,下面,说几个没提到的类的信息。得到类的名字类的名字有

6、两种方式得到,一种是 getName(),一种是 getSimpleName()。第一种得到的是全限定名,第二种得到的是这个类的名字,不带包名。看下面的例子:Class 对象,已经通过上面的代码得到了。String fullClassName = exampleObjectClass.getName();String simpleClassName = exampleObjectClass.getSimpleName();System.out.println(fullClassName);System.out.println(simpleClassName);结果如下:cn.byhieg.re

7、flectiontutorial.ExampleObjectExampleObject得到类的包名、父类和实现的接口类的包名和父类,可以通过如下代码得到。/得到包信息Package aPackage = exampleObjectClass.getPackage();System.out.println(aPackage);/得到父类Class superClass = exampleObjectClass.getSuperclass();System.out.println(superClass.getSimpleName();结果如下:package cn.byhieg.reflectio

8、ntutorialFatherObject很显然,得到父类的返回值也是一个 Class 对象,那么可以利用这个对象得到父类的一些信息,比如判断父类是不是抽象类System.out.println(父类是不是抽象类 + Modifier.isAbstract(superClass.getModifiers();getModifiers 可以得到类的修饰符,从而得到类的修饰符,当然,这个 getModifiers 不仅仅 Class 对象可以调用, Method 对象可以调用。可以使用 java.lang.reflect.Modifier 类中的方法来检查修饰符的类型:Modifier.isAbs

9、tract(int modifiers);Modifier.isFinal(int modifiers);Modifier.isInterface(int modifiers);Modifier.isNative(int modifiers);Modifier.isPrivate(int modifiers);Modifier.isProtected(int modifiers);Modifier.isPublic(int modifiers);Modifier.isStatic(int modifiers);Modifier.isStrict(int modifiers);Modifier.

10、isSynchronized(int modifiers);Modifier.isTransient(int modifiers);Modifier.isVolatile(int modifiers);此外,我们还可以得到父类实现的接口/得到接口Class classes = superClass.getInterfaces();System.out.println(父类的接口 + classes0);因为 Java 类可以实现很多接口,所以用的数组,但在实际使用的时候,需要先判断数组的长度。下面,重点讲解上述列出来的内容。构造器利用 Java 反射可以得到一个类的构造器,并根据构造器,在运行

11、时动态的创建一个对象。首先,Java 通过以下方式获取构造器的实例:/构造器Constructor constructors = exampleObjectClass.getConstructors();for (Constructor constructor : constructors)System.out.println(constructor.toString();结果如下:public cn.byhieg.reflectiontutorial.ExampleObject(int,java.lang.Integer)public cn.byhieg.reflectiontutorial

12、.ExampleObject(java.lang.String)public cn.byhieg.reflectiontutorial.ExampleObject()如果,事先知道要访问的构造方法的参数类型,可以利用如下方法获取指定的构造方法,例子如下:Constructor constructor = exampleObjectClass.getConstructor(String.class);System.out.println(constructor.toString();结果显然是:public cn.byhieg.reflectiontutorial.ExampleObject(j

13、ava.lang.String)还可以用如下方式得到另一个构造器Constructor constructor = exampleObjectClass.getConstructor(int.class,Integer.class);System.out.println(constructor.toString();此外,如果我们不知道构造器的参数,只能得到所有的构造器对象,那么可以用如下方式得到每一个构造器对想的参数:Constructor constructors = exampleObjectClass.getConstructors();for (Constructor constru

14、ctor : constructors)Class parameterTypes = constructor.getParameterTypes();System.out.println(构造器参数如下=);for (Class clz : parameterTypes)System.out.println(参数类型 + clz.toString(); 结果如下:构造器参数如下=参数类型 class java.lang.String构造器参数如下=参数类型 int参数类型 class java.lang.Integer这里,可以看出无参构造方法,是不打印出结果的。基本类型的 Class 对象和

15、引用类型的 Class 对象 toString()方法是不一样的。现在,可以根据构造器的各种信息,动态创建一个对象。Object object = constructor.newInstance(1,100);System.out.println(object.toString();这个创建对象的方式有 2 个条件,第一是通过有参构造器创建的,第二,构造器对象必须通过传入参数信息的 getConstructor 得到。第一个条件,对于无参构造方法就可以创建的对象,不需要得到构造器对象,直接 Class 对象调用 newInstance()方法就直接创建对象。第二个条件,构造器对象必须通过 ex

16、ampleObjectClass.getConstructor(String.class);这种形式得到。如果通过 getConstructors 得到构造器数组,然后调用指定的构造器对象去创建对象在 JDK1.8 是会错的。但是 JDK1.6 是正常的。变量利用 Java 反射可以在运行时得到一个类的变量信息,并且可以根据上面讲的方式,创建一个对象,设置他的变量值。首先,通过如下方法,得到所有 public 的变量:Field fields = exampleObjectClass.getFields();for (Field field : fields)System.out.println(变量为: + fi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号