简介
JAVA反射机制(JAVA Reflection)是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
作用
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
Class
- Class 类的实例表示正在运行的 Java 应用程序中的类和接口
- 枚举是一种类,注释是一种接口
- 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象
主要方法
- static Class<?> forName(String className) //返回与带有给定字符串名的类或接口相关联的 Class 对象
- static Class<?> forName(String name, boolean initialize, ClassLoader loader) //使用给定的类加载器,返回与带有给定字符串名的类或接口相关联的 Class 对象
- <A extends Annotation> A getAnnotation(Class<A> annotationClass) //返回这些注释,否则返回 null
- Annotation[] getAnnotations() //返回此元素上存在的所有注释
- Class<?>[] getClasses() //返回一个对象的数组,表示的类的成员的所有公共类和接口
- Constructor<T> getConstructor(Class<?>... parameterTypes) //表示的类的指定公共构造方法
- Constructor<?>[] getConstructors() //返回表示的类的所有公共构造方法
- Class<?>[] getDeclaredClasses() //返回 Class 对象的一个数组表示的类的成员的所有类和接口
- Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //表示的类或接口的指定构造方法
- Constructor<?>[] getDeclaredConstructors() //表示的类声明的所有构造方法
- Field getDeclaredField(String name) //表示的类或接口的指定已声明字段
- Field[] getDeclaredFields() 表示的类或接口所声明的所有字段
- Method getDeclaredMethod(String name, Class<?>... parameterTypes) //表示的类或接口的指定已声明方法
- Method[] getDeclaredMethods() //返回一个数组表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
- Class<?> getDeclaringClass() //如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类
- Field getField(String name) //表示的类或接口的指定公共成员字段
- Field[] getFields() //返回一个数组,表示的类或接口的所有可访问公共字段
- Type[] getGenericInterfaces() //返回表示某些接口的 Type,表示的类或接口直接实现
- Type getGenericSuperclass() //返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type
- Class<?>[] getInterfaces() //确定此对象所表示的类或接口实现的接口
- Method getMethod(String name, Class<?>... parameterTypes) //表示的类或接口的指定公共成员方法
- Method[] getMethods() //返回一个包含某些 Method 对象的数组,表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法
实例应用
//获取构造方法
import java.lang.reflect.Constructor;
class Person{
public Person() {
System.out.println("Person.Person()");
}
}
public class FanShe1 {
public static void main(String[] args) throws Exception {
Class<?> c1=null;
//1.获取类对象
try {
//包名加具体的类名
c1= Class.forName("fanshe2.test.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2.获取构造器,此时getConstructor()只有一个参数
Constructor const1 = c1.getConstructor();
//3.用反射去调用构造器:
const1.newInstance();
//对于无参的公共的构造方法的调用,可以直接用类对象进行.
//所以在设计类的时候,最好写上一个无参的构造器
c1.newInstance();
}
}