- 反射机制(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.UserClass 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;}@Overridepublic 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
