java 反射机制-java类,java反射机制-java
java 反射机制-java类,java反射机制-java
Java 反射机制
Java 反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值。
java 类
使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容:
- Class 对象
- 类名
- 修饰符
- 包信息
- 父类
- 实现的接口
- 构造器
- 方法
- 变量
- 注解
-
Class 对象
- 在检查类信息之前,首先需要获取类的Class对象。Java 中的所有类型包括基本类型(int, long, float等等),即使是数组都有与之关联的 Class 类的对象。如果你在编译期知道一个类的名字的话,那么你可以使用如下的方式获取一个类的 Class 对象。
Class myObjectClass = MyObject.class;
如果你在编译期不知道类的名字,但是你可以在运行期获得到类名的字符串,那么你则可以这么做来获取 Class 对象:
String className = ... ;//在运行期获取的类名字符串 Class class = Class.forName(className);
在使用 Class.forName() 方法时,你必须提供一个类的全名,这个全名包括类所在的包的名字。例如 MyObject 类位于 com.jenkov.myapp 包,那么他的全名就是 com.jenkov.myapp.MyObject。 如果在调用Class.forName()方法时,没有在编译路径下(classpath)找到对应的类,那么将会抛出ClassNotFoundException。
-
类名
你可以从 Class 对象中获取两个版本的类名。
通过 getName() 方法返回类的全限定类名(包含包名):
Class aClass = ... //获取Class对象,具体方式可见Class对象小节 String className = aClass.getName();
如果你仅仅只是想获取类的名字(不包含包名),那么你可以使用 getSimpleName()方法:
Class aClass = ... //获取Class对象,具体方式可见Class对象小节 String simpleClassName = aClass.getSimpleName();
-
修饰符
可以通过 Class 对象来访问一个类的修饰符, 即public,private,static 等等的关键字,你可以使用如下方法来获取类的修饰符:
Class aClass = ... //获取Class对象,具体方式可见Class对象小节 int modifiers = aClass.getModifiers();
修饰符都被包装成一个int类型的数字,这样每个修饰符都是一个位标识(flag bit),这个位标识可以设置和清除修饰符的类型。 可以使用 java.lang.reflect.Modifier 类中的方法来检查修饰符的类型:
Modifier.isAbstract(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.isSynchronized(int modifiers); Modifier.isTransient(int modifiers); Modifier.isVolatile(int modifiers);
-
包信息
可以使用 Class 对象通过如下的方式获取包信息:
Class aClass = ... //获取Class对象,具体方式可见Class对象小节 Package package = aClass.getPackage();
-
父类
通过 Class 对象你可以访问类的父类,如下例:
Class superclass = aClass.getSuperclass();
可以看到 superclass 对象其实就是一个 Class 类的实例,所以你可以继续在这个对象上进行反射操作。
实现的接口
可以通过如下方式获取指定类所实现的接口集合:
Class aClass = ... //获取Class对象,具体方式可见Class对象小节 Class[] interfaces = aClass.getInterfaces();
由于一个类可以实现多个接口,因此 getInterfaces(); 方法返回一个 Class 数组,在 Java 中接口同样有对应的 Class 对象。 注意:getInterfaces() 方法仅仅只返回当前类所实现的接口。当前类的父类如果实现了接口,这些接口是不会在返回的 Class 集合中的,尽管实际上当前类其实已经实现了父类接口。
构造器
你可以通过如下方式访问一个类的构造方法:
Constructor[] constructors = aClass.getConstructors();
更多有关 Constructor 的信息可以访问 Constructors。
方法
你可以通过如下方式访问一个类的所有方法:
Method[] method = aClass.getMethods();
变量
你可以通过如下方式访问一个类的成员变量:
Field[] method = aClass.getFields();
更多有关 Field 的信息可以访问 Fields。
注解
你可以通过如下方式访问一个类的注解:
Annotation[] annotations = aClass.getAnnotations();
相关文章
- 暂无相关文章
用户点评