在java程序运行状态中,对于任意一个类,可以获取其所有的属性和方法,对于任意一个对象可以动态的调用其方法获取其属性。我们称这种特性为java反射。
应用:
在程序运行过程中,动态实现以下操作:
1)通过反射创建对象
a. Class.newInstance()
b. Construction.newInstance()
//通过反射创建对象//1、通过newInstance创建对象,调用无参构造
Student student=studentClass.newInstance();//2、通过构造器创建对象
Constructor constructor =studentClass.getDeclaredConstructor();//设置是否允许访问,当private方法设置为true后,可以直接调用
constructor.setAccessible(true);//通过构造器调用对象
Student student1 =constructor.newInstance();
Student student2=constructor.newInstance();
System.out.println(student1==student2);//false
2)通过反射获取对象的类型,属性,方法,构造
/**
* 演示获取类的各种信息*/
public static voidgetClassInfo() throws NoSuchFieldException {
Class studentClass = Student.class;//获取类上的注解
Annotation[] annotations=studentClass.getAnnotations();//根据名称获取单个属性
Field name=studentClass.getField("name");
name.setAccessible(true);
LogData annotation= name.getAnnotation(LogData.class);
Field[] fields= studentClass.getFields();//获取类中的public属性
Field[] declaredFields = studentClass.getDeclaredFields();//获取类中定义的所有属性//获取类的方法
Method[] methods = studentClass.getMethods();//获取类中的public的方法(包含父类方法)
Method[] declaredMethods = studentClass.getDeclaredMethods();//获取类中定义的所有方法//获取实现的接口
Class>[] interfaces =studentClass.getInterfaces();//获取类的父类
Class super Student> superclass =studentClass.getSuperclass();//包含包名的类名
String name1 =studentClass.getName();//不包含包名的类名
String simpleName =studentClass.getSimpleName();
}
3)动态调用对象的方法,获取对象的属性
4)获取方法或属性上的注解信息
反射中涉及到的常用类
1) Class类:用来描述类信息的类
2) Method类:用来描述方法的类
3) Field类:用来描述属性的类
4) Construction类:用来描述构造方法
获取Class对象的方式
1) 类名.class
2) 对象.getClass();
3) Class.forName(“类的全路径”)
//获取class对象,一个类只有一个Class对象
Class studentClass=Student.class;
Class extends Student> aClass=newStudent().getClass();
Class> aClass1=Class.forName("entity.Student");
System.out.println(studentClass==aClass);//true
System.out.println(studentClass==aClass1);//true