定义
Java的反射(reflection)机制是指在程序的运行状态
中,可以构造任何一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为 Java语言的反射机制
功能
Java 反射机制主要提供了以下功能:
1、在 运行时 判断任意一个对象所属的类;
2、在 运行时 构造任意一个类的对象;
3、在 运行时 判断任意一个类所具有的成员变量和方法;
4、在 运行时 调用任意一个对象的方法;
换句话说。Java程序可以加载一个 运行时
才得知名称的 class,获悉其完整构造(但不包括methods定义),并生成其 对象实体、或对其 fields 设值、或 唤起其 methods 。
很多类在开发阶段是没有的,在编译等阶段,通过一定技术动态生成,这种情况下,要调用生成类的相关方法等操作时,通过反射是个很好的方法。
本文会从具体细节谈到 java.lang.Class
,以及 java.lang.reflect
中的 Method、Field、Constructor、Parameter等内容。
Class类
对于一个字节码文件 .class
,虽然表面上我们对该字节码文件一无所知,但该文件本身却记录了许多信息。Java在将.class
字节码文件 载入内存时,JVM将产生一个 java.lang.Class
对象代表该 .class
文件,从该 Class 对象中可以获得类的许多基本信息,这就是反射机制。所以想完成反射操作,就必须首先认识 Class 类
- 获得类相关的方法
方法 | 用途 |
---|---|
getClasses() | 返回一个数组,数组中包含该类中所有公共 类 和 接口 类对象 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中所有类 和 接口 类对象 |
forName(String className) | 根据类名返回类的对象 |
getName() | 获取类的完整 路径名字 |
newInstance() | 获得类的实例 |
getPackage() | 获得类的包 |
getSimpleName() | 获得类的包 |
getSuperclass() | 获得当前类集成的父类 |
getInterfaces() | 获得当前类、接口实现的 接口
|
/**
Determines the interfaces implemented by the class or interface represented by this object.
If this object represents a class or interface that implements no interfaces,
the method returns an array of length 0.
*/
public Class<?>[] getInterfaces()
- 获得类中属性相关的方法
方法 | 用途 |
---|---|
getField(String name) | 获得某个公有 属性对象 |
getFields() | 获得所有共有 的属性对象 |
getDeclaredField(String name) | 获得某个属性对象 |
getDeclaredFields() | 获得所有属性对象 |
- 获得类中注解相关的方法
方法 | 用途 |
---|---|
getAnnotation(Class<A> annotationClass) | 获得该类中与参数类型匹配的公有 注解对象 |
getAnnotations() | 获得该类中所有的公有 注解对象 |
getDeclaredAnnotation(Class<A> annotationClass) | 获得该类中与参数类型匹配的所有注解对象 |
getDeclaredAnnotations() | 获得该类中所有的注解对象 |
- 获得类中构造器相关的方法
方法 | 用途 |
---|---|
getConstructor(Class<?>... parameterTypes)) | 获得该类中与参数类型匹配的公有 构造方法 |
getConstructors() | 获得该类的所有公有 构造方法 |
getDeclaredConstructor(Class<?>... parameterTypes) | 获得该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获得该类所有构造方法 |
- 获得类中方法相关的方法
方法 | 用途 |
---|---|
getMethod(String name, Class...<?> parameterTypes) | 获得该类中某个公有 的方法 |
getMethods() | 获得该类所有公有 的方法 |
getDeclaredMethod(String name, Class...<?> parameterTypes) | 获得该类某个方法 |
getDeclaredMethods() | 获得该类所有方法 |
- 类中其它重要的方法
方法 | 用途 |
---|---|
isAnnotation() | 如果是注解类型返回true |
isAnonymousClass() | 匿名类返回true |
isEnum() | 枚举返回true |
isInstance(Object obj) | 如果obj是该类的实例则返回true |
isInterface() | 如果是接口类返回true |
isLocalClass() | 如果是局部类返回true |
isMemberClass() | 如果是内部类返回true |
获得
Class
对象的三种方式:
1、类.class
例如:Class clazz = String.class
2、Class.forName()
例如:Class clazz = Class.forName("com.lang.String");
3、实例.getClass();
Field类
Field 代表类的成员变量
方法 | 用途 |
---|---|
equals(Object obj) | 属性与obj相等则返回true |
get(Object obj) | 获取obj中对应的属性值 |
set(Object obj,Object value) | 设置obj中的对应属性值 |
Method类
Method 代表类的方法
方法 | 用途 |
---|---|
invoke(Object obj, Object... args) | 传递obj对象以及参数调用该对象对应的方法 |
Constructor类
方法 | 用途 |
---|---|
newInstance(Object... initargs) | 根据传递的参数创建类的对象 |
总结
本文介绍了 反射的概念,以及反射能干什么事。以及在使用过程中一些常用的、重要的一些类及其方法,更多的信息和用法需要在使用过程中查看API及文档。
参考:
https://baike.baidu.com/item/JAVA反射机制/6015990
https://www.jianshu.com/p/9be58ee20dee
网友评论