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();
}
}
}