1反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
2反射机制能做什么
反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
3反射机制的相关API
通过一个对象获得完整的包名和类名
package edu.pri.lime.test; public class TestReflect { public static void main(String[] args){
TestReflect reflect = new TestReflect();
// 通过一个对象获得完整的包名和类名
System.out.println(reflect.getClass().getName());
}
}
实例化Class类对象
package edu.pri.lime.test; public class TestReflect { public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazzA = Class.forName("edu.pri.lime.test.TestReflect");
Class<?> clazzB = new TestReflect().getClass();
Class<?> clazzC = TestReflect.class; System.out.println(clazzA.getName());
System.out.println(clazzB.getName());
System.out.println(clazzC.getName());
}
}
获取一个对象的父类与实现的接口
package edu.pri.lime.test; import java.io.Serializable; public class TestReflect implements Serializable{ private static final long serialVersionUID = -3407476067923921222L; public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect");
// 获取父类
Class<?> clazzSup = clazz.getSuperclass();
System.out.println(clazzSup.getName()); // 获取所有接口
Class<?> clazzInte[] = clazz.getInterfaces();
for(Class<?> in : clazzInte){
System.out.println(in.getName());
}
}
}
获取某个类中的全部构造函数
package edu.pri.lime.test; import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier; public class TestReflect implements Serializable{
private static final long serialVersionUID = -3407476067923921222L; private int id;
private String name; public TestReflect() {
super();
// TODO Auto-generated constructor stub
} public TestReflect(int id) {
super();
this.id = id;
} public TestReflect(String name) {
super();
this.name = name;
} public TestReflect(int id, String name) {
super();
this.id = id;
this.name = name;
} public static void main(String[] args) throws ClassNotFoundException{ Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect");
// 获取所有构造函数
Constructor<?>[] constructors = clazz.getConstructors();
for(Constructor<?> con : constructors){
// 获取构造函数所有参数类型
Class<?>[] paramTypes = con.getParameterTypes();
System.out.print(Modifier.toString(con.getModifiers()) + " ");
System.out.print(con.getName() + "(");
for(int i = 0;i < paramTypes.length;i++){
if(i < paramTypes.length - 1){
System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1) + ",");
}else{
System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1));
}
}
System.out.println(");");
}
}
}