Java反射可以在运行时检视类、接口、属性和方法,而无需在编译时知道类名、方法名等等。它也同样使用反射支持实例化新的对象、调用方法和get/set属性值。
Java反射非常强大和有用。例如, Java反射可以用在映射JSON文件的属性到Java 对象的get/set方法,如Jackson、Gosn、Boon等库的实现。另外,反射可以用在映射JDBC结果集的列名到Java对象的get/set方法。
本教程将深入介绍Java反射。它将解释Java反射的基础知识,包括如何使用数组、注解、范型和动态代理,以及动态类的加载和重新加载。
它还将向您展示如何执行更具体的Java反射任务,例如读取类的所有getter方法,或访问类的私有字段和方法。
本教程还将清除一些关于范型信息在运行时可用性的认知混淆。一些人声称所有范型信息在运行时丢失,这是不正确的。
本教程描述基于Java8。
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 类对象
使用Java反射时,起点通常是需要使用反射检视的类的Class
对象。例如,获得名为MyObject
类的Class
对象可以这么写:
Class myObjectClass = MyObject.class;
现在,你可以引用类MyObject
的Class
对象。
在Java Reflection Class tutorial中有Class
对象更详细的描述。
方法和属性
一旦你拥有表示某些类的Class
对象的引用,你可以访问这些类的方法和属性。下面是访问一个Java类方法和属性的示例:
Class myObjectClass = MyObject.class;
Method[] methods = myObjectClass.getMethods();
Field[] fields = myObjectClass.getFields();
一旦拥有一个java类的方法和属性的引用,就可以开始检视它们。你可以获得方法和属性的名称,采用的参数等等。你甚至可以通过这些方法和属性引用调用方法和使用get/set属性值。
在Java Reflection Fields tutorial和Java Reflection Methods tutorial教程中有关于访问方法和属性的更详尽的描述。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。