Java反射机制
反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的方法和属性。这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。
反射机制提供的功能:
- 运行时判断任意一个对象所属类。
- 运行时构造任意一个类的对象。
- 运行时获取任意一个类的成员变量和方法。
- 运行时调用任意一个对象的方法。
- 生成代理类
Java中反射的实现
- 通过类名调用class属性得到该类的Class对象
Class<?> clazz = String.class - 调用实例的getClass()方法
String str = new String();
Class<?> clazz = str.getClass(); - 通过Class.forName()方法加载字符串,就可以得到该字符串做代表的Class对象。
Class<?> clazz = Class.forName(“java.lang.String”) - 如果是基本类型的包装类,则可以通过调用包装类的Type属性来获得该包装类的Class对象。
Class<?> clazz = Integer.TYPE;
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
- Class类:代表一个类。
- Field类:代表类的成员变量(成员变量也称为类的属性)。
- Method类:代表类的方法。
- Constructor类:代表类的构造方法。
- Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
- Modifier类:代表修饰符。
反射的使用
public class ReflectTest {
public static void main(String[] args) {
User user = new User();
Class clsUser = user.getClass();
Field field , fields[];
try {
//获取对象的uid成员变量
field = clsUser.getDeclaredField("uid");
System.out.println("field:"+field);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
//获取对象的所有成员变量
fields = clsUser.getDeclaredFields();
for(Field f : fields){
System.out.println("field:"+ f);
}
Method method , methods1[] , methods2[];
try {
//获取getUid成员方法
method = clsUser.getMethod("getUid");
System.out.println("method:"+method);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//获取对象所有公共方法,包含继承父类来的方法
methods1 = clsUser.getMethods();
for(Method m : methods1){
System.out.println("method:"+ m);
}
//获取对象的所有方法,不包含继承父类来的方法
methods2 = clsUser.getDeclaredMethods();
for(Method m : methods2){
System.out.println("method:"+ m);
}
int clsMod = clsUser.getModifiers();
System.out.println(clsMod);
Constructor clsCon , clsCons1[] , clsCons2[];
try {
//获取无参构造函数
clsCon = clsUser.getConstructor();
System.out.println(clsCon);
//通过无参构造函数创建一个object对象
Object object = clsCon.newInstance();
System.out.println(object);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//获取所有构造函数
clsCons1 = clsUser.getConstructors();
for(Constructor c : clsCons1){
System.out.println("constructor:"+ c);
}
//获取所有声明的构造函数
clsCons2 = clsUser.getDeclaredConstructors();
for(Constructor c : clsCons2){
System.out.println("constructor:"+ c);
}
}
}