Java反射能够在运行时检视类、接口、属性和方法,而无需在编译时知道类名、方法名等等。它也一样使用反射支持实例化新的对象、调用方法和get/set属性值。
Java反射很是强大和有用。例如, Java反射能够用在映射JSON文件的属性到Java 对象的get/set方法,如Jackson、Gosn、Boon等库的实现。另外,反射能够用在映射JDBC结果集的列名到Java对象的get/set方法。
本教程将深刻介绍Java反射。它将解释Java反射的基础知识,包括如何使用数组、注解、范型和动态代理,以及动态类的加载和从新加载。
它还将向您展现如何执行更具体的Java反射任务,例如读取类的全部getter方法,或访问类的私有字段和方法。
本教程还将清除一些关于范型信息在运行时可用性的认知混淆。一些人声称全部范型信息在运行时丢失,这是不正确的。
本教程描述基于Java8。html
这是一个快速的Java反射示例,向你展现使用反射的代码格式:java
Method[] methods = MyObject.class.getMethods(); for(Method method : methods){ System.out.println("method = " + method.getName()); }
Method [] methods=String.class.getMethods(); for (Method method:methods) { logger.debug("String 类方法名称:{},参数个数:{}",method.getName(),method.getParameterCount()); }
本示例从一个名为MyObject
的类中获取一个Class
对象。使用这个class对象展现得到它的方法列表,循环并输出方法名称。数组
使用Java反射时,起点一般是须要使用反射检视的类的Class
对象。例如,得到名为MyObject
类的Class
对象能够这么写:debug
Class myObjectClass = MyObject.class;
如今,你能够引用类MyObject
的Class
对象。
在Java Reflection Class tutorial中有Class
对象更详细的描述。代理
一旦你拥有表示某些类的Class
对象的引用,你能够访问这些类的方法和属性。下面是访问一个Java类方法和属性的示例:code
Class myObjectClass = MyObject.class; Method[] methods = myObjectClass.getMethods(); Field[] fields = myObjectClass.getFields();
一旦拥有一个java类的方法和属性的引用,就能够开始检视它们。你能够得到方法和属性的名称,采用的参数等等。你甚至能够经过这些方法和属性引用调用方法和使用get/set属性值。
在Java Reflection Fields tutorial和Java Reflection Methods tutorial教程中有关于访问方法和属性的更详尽的描述。htm