- 反射机制(Reflection)允许程序在执行期间借助 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性以及方法
- 加载完类之后,在堆内存的方法区中就产生了一个
Class
类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息,我们可以通过这个对象看到类的结构。
反射相关 API:
- java.lang.Class
- java.lang.reflect.Method:方法
- java.lang.reflect.Field:属性
- java.lang.reflect.Constructor:构造器
- ……
1 获取 Class 反射对象
package com.lht.reflection;
public class TestReflection {
public static void main(String[] args) throws ClassNotFoundException {
// 输出 class com.lht.reflection.User
Class c1 = Class.forName("com.lht.reflection.User");
System.out.println(c1);
}
}
// 实体类
class User {
private String name;
private int id;
public User() {
}
public User(String name, int id) {
this.name = name;
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "com.lht.reflection.User{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
Class 对象有很多方法:
getAnnotation()
获取注解newInstance()
new 一个该类对象getMethods()
获取该类的方法- ……
一个类只有一个 Class 对象,可以通过打印 hash code 来验证:
Class c1 = Class.forName("com.lht.reflection.User");
Class c2 = Class.forName("com.lht.reflection.User");
Class c3 = Class.forName("com.lht.reflection.User");
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
可以发现它们的 hash code 是相同的。
在 Object 类中定义了public final Class getClass()
方法,此方法被所有子类继承,并且与Class.forName()
获得的 Class 对象是同一个。
2 得到 Class 类的几种方式
- 通过类的静态属性
**class**
获取。该方法最为安全可靠,程序性能最高
Class clazz = Person.class;
- 通过某个类实例的
**getClass()**
方法获取
Class clazz = person.getClass();
- 通过包名 + 类名(全类名)使用 Class 类的静态方法
**forName()**
获取,可能抛出**ClassNotFoundException**
。
Class clazz = Class.forName("com.lht.Reflection.User");
- 内置基本类型的包装类可以直接使用【类名.Type】
- 利用 ClassLoader