Java反射
反射的功能:
能够在程序运行时动态获取一个类的完整信息。
在运行时判断任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判段任意一个类所具有的成员变量和方法
在运行时调用任一个对象的方法
在运行时创建新类对象
在使用Java的反射功能时,基本首先都要获取类的Class对象,再通过Class对象获取其他的对象。
package reflect;
public class Student {
private Integer id;
private String name;
public Student(){
}
public Student(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectDemo {
public static void main(String[] args) {
// 获取Class对象的集中方法
// Class clazz = Student.class;
// Class clazz = new Student().getClass();
Class clazz = null;
try {
clazz = Class.forName("reflect.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 获取公有(public)成员d变量
Field[] fields = clazz.getFields();
for(Field field : fields) {
// System.out.println(field);
}
// 获取所有声明的成员变量(包括public private protected)
Field[] fields1 = clazz.getDeclaredFields();
for(Field field : fields1) {
// System.out.println(field);
}
// 获取所有的public方法,包括父类的。
Method[] methods = clazz.getMethods();
for(Method method : methods) {
// System.out.println(method);
}
// 获取所有声明的方法(public private protected)方法,不包括父类的。
Method[] methods1 = clazz.getDeclaredMethods();
for(Method method : methods1) {
// System.out.println(method);
}
// 操作成员变量
try {
Constructor constructor = clazz.getConstructor();
Object obj = constructor.newInstance();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(obj,"小明");
// System.out.println(field.get(obj));
} catch (Exception ex) {
ex.printStackTrace();
}
// 调用方法
try {
Constructor constructor = clazz.getConstructor();
Object obj = constructor.newInstance();
Method method = clazz.getDeclaredMethod("setName", String.class);
method.invoke(obj,"小红");
Method method1 = clazz.getDeclaredMethod("getName");
Object obj2 = method1.invoke(obj);
System.out.println(obj2);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}