目录
技术简介
反射是java中一个重要的技术,将类的各个部分封装为其他对象(Class),以致于能在程序运行期间获取一个类的所有信息。
使用场景
- 在框架中被大量使用,是框架设计的灵魂,尤其是使用最广泛的 spring 的 IOC,用以提高程序猿的开发效率。
- 在 ida 的代码提示中的使用
反射机制原理以及使用方法
反射机制原理
参考链接
以 Peron.java 为例
- 程序员编写完 Person.java 文件之后,通过ide编译为 .class 文件
- class 文件通过 ClassLoader 加载之后,程序才能通过 new Person() 或者别的方式来获取person对象
- 反射是在 class 文件在 ClassLoader 加载器之后,通过一些手段获取 Person 类的所有信息
常用方法
获取 Person 类对应的 class 对象
Person类:
public class Person {
//私有属性
private String name;
private int age;
//公开的属性
public String address;
//无参构造器
public Person() {
}
//有参构造器
public Person(String name, int age, String address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
//getter and setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
获取 class 对象的三种方法
1)通过 .class 获取
Class<?> cls = Person.class;
System.out.println(cls);
运行结果:
2)通过 Class.forName("") 获取
Class<?> cls = Class.forName("com.reflect.Person");
System.out.println(cls);
运行结果:
3) 通过 对象 .getClass() 获取
Person p = new Person();
Class<? extends Person> cls = p.getClass();
System.out.println(cls);
运行结果:
获取成员变量信息
Field[] declaredFields = cls.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
System.out.println(declaredFields[i]);
}
运行结果:
获取方法信息
Method[] methods = cls.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}
运行结果:
获取构造器信息
Constructor<?>[] constructors = cls.getConstructors();
for (int i = 0; i < constructors.length; i++) {
System.out.println(constructors[i]);
}
运行结果:
通过 class 对象获取 Person对象的信息
- 通过反射创建 person 对象(无参构造器)
Person person = (Person) cls.newInstance();
System.out.println(person);
运行结果:
2. 通过反射创建 person 对象(有参构造器)
Constructor<?> constructor = cls.getConstructor(String.class, Integer.class, String.class);
Person person = (Person) constructor.newInstance("1",2,"1");
System.out.println(person);
运行结果:
写在结尾
在框架中,多使用以上技术,通过配置文件和反射技术来获取指定类的所有信息,以减少对代码的入侵,让程序猿只关注写自己的代码。