Java反射机制是的运行状态中(.calsss),对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。java
在平常的第三方开发过程当中,常常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就能够利用Java的反射机制经过反射来获取所需的私有成员或是方法。用到反射的经常使用框架有spring\dubbo等等spring
类名 | 用途 |
---|---|
java.lang.Class | 表明类的实体,在运行的Java应用程序中表示类和接口 |
java.lang.reflect.Field | 表明类的成员变量(成员变量也称为类的属性) |
java.lang.reflect.Method | 表明类的方法 |
java.lang.reflect.Constructor | 表明类的构造方法 |
Class表明类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了不少有用的方法,这里对他们简单的分类介绍。数组
方法 | 用途 |
---|---|
asSubclass(Class<U> clazz) | 把传递的类的对象转换成表明其子类的对象 |
Cast | 把对象转换成表明类或是接口的对象 |
getClassLoader() | 得到类的加载器 |
getClasses() | 返回一个数组,数组中包含该类中全部公共类和接口类的对象 |
getDeclaredClasses() | 返回一个数组,数组中包含该类中全部类和接口类的对象 |
forName(String className) | 根据类名返回类的对象 |
getName() | 得到类的完整路径名字 |
newInstance() | 建立类的实例 |
getPackage() | 得到类的包 |
getSimpleName() | 得到类的名字 |
getSuperclass() | 得到当前类继承的父类的名字 |
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 |
isAnnotationPresent(Class<? extends Annotation> annotationClass) | 若是是指定类型注解类型则返回true |
isAnonymousClass() | 若是是匿名类则返回true |
isArray() | 若是是一个数组类则返回true |
isEnum() | 若是是枚举类则返回true |
isInstance(Object obj) | 若是obj是该类的实例则返回true |
isInterface() | 若是是接口类则返回true |
isLocalClass() | 若是是局部类则返回true |
isMemberClass() | 若是是内部类则返回true |
Field表明类的成员变量(成员变量也称为类的属性)框架
方法 | 用途 |
---|---|
equals(Object obj) | 属性与obj相等则返回true |
get(Object obj) | 得到obj中对应的属性值 |
set(Object obj, Object value) | 设置obj中对应属性值 |
Method表明类的方法。对象
方法 | 用途 |
---|---|
invoke(Object obj, Object... args) | 传递object对象及参数调用该对象对应的方法 |
Constructor表明类的构造方法。继承
方法 | 用途 |
---|---|
newInstance(Object... initargs) | 根据传递的参数建立类的对象 |
在阅读Class类文档时发现一个特色,以经过反射得到Method对象为例,通常会提供四种方法,getMethod(parameterTypes)、getMethods()、getDeclaredMethod(parameterTypes)和getDeclaredMethods()。getMethod(parameterTypes)用来获取某个公有的方法的对象,getMethods()得到该类全部公有的方法,getDeclaredMethod(parameterTypes)得到该类某个方法,getDeclaredMethods()得到该类全部方法。接口
带有Declared修饰的方法能够反射到私有的方法,没有Declared修饰的只能用来反射公有的方法。 其余的Annotation、Field、Constructor也是如此。开发
在ReflectClass类中还提供了两种反射PowerManager.shutdown()的方法,在调用的时候会输出以下log,提示没有相关权限。以前在项目中尝试反射其余方法的时候还遇到过有权限和没权限返回的值不同的状况。文档
若是源码中明确进行了权限验证,而你的应用又没法得到这个权限的话,建议就不要浪费时间反射了。get