反射
反射概述:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。
反射本质理解:
一个类只产生一个class对象,在得到此对象后可以反向获取类的各种信息。
我们一般平时是通过new的形式创建对象实际上就是通过这些Class来创建的,只不过这个class文件是编译的时候就生成的,程序相当于写死了给jvm去跑。
反射可以在获取class对象后,获取有关类的所有信息,并且可以创建一个实例对象,调用方法等。
首先创建一个Person类,里面有age,name属性,还有一个自定义的eat方法
public class Person {
int age;
String name;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void eat() {
System.out.println("我正在吃饭");
}
}
public class student {
public static void main(String[] args) throws Exception {
// 通过类获取类对象
Class cla = Class.forName("experiment.Person");
//获取类对象里面的变量
Field[] declaredFields = cla.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
//由类对象创建一个Person对象
Person student =(Person)cla.getDeclaredConstructor().newInstance();
student.eat();
}
}
可以看到通过Person可以获取其age,name的变量名,还可以由其class对象创建一个实例对象调用Person类的方法
(5)反射作用:获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等获取任意对象的属性,并且能改变对象的属性调用任意对象的方法判断任意一个对象所属的类实例化任意一个类的对象
正是上述的作用,通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。在学习spring,mybatis等框架的时候,不妨有一个更底层的思考。