簡介:
JAVA反射機制是在程序運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意屬性和方法;這種動態獲取信息以及動態調用對象方法的功能稱爲 java 的反射機制。
本文總結了 java 反射的基本使用方法,不涉及反射機制原理。
動態加載類
People 接口:
public interface People {
public void eat();
}
接口實現類 Student :
public class Student implements People {
@Override
public void eat() {
System.out.println("sudent eat");
}
}
主類 Test :
public class Test {
public static void main(String[] args) {
try {
String classStr = "com.guofeng.Student";
Class mClass = Class.forName(classStr);
People p = (People) mClass.newInstance();
p.eat();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
}
}
輸出:
sudent eat
獲取類的方法和成員變量
Car 類:
public class Car {
private boolean window;
private String wheel;
public Car() {}
public Car(boolean window, String wheel) {
this.window = window;
this.wheel = wheel;
}
public void dirve(String driverName) {
System.out.println(driverName+":皮皮蝦,我們走!");
}
}
ClassUtil ,封裝獲取類的方法和屬性的方法:
public class ClassUtil {
public static void getClassMethod(Object obj) {
Class mClass = obj.getClass();
System.out.println("類名:" + mClass.getName());
//獲取所有的public方法,包括繼承而來的
//Method[] ms = mClass.getMethods();
//獲取該類自己聲明的方法,不管訪問權限
Method[] ms = mClass.getDeclaredMethods();
for (Method m : ms) {
Class returnType = m.getReturnType();
System.out.println("返回類型:" + returnType.getName());
System.out.println("方法名:" + m.getName());
Class[] paramTypes = m.getParameterTypes();
for (Class paramType : paramTypes) {
System.out.println("參數類型:" + paramType.getName());
}
}
}
public static void getClassField(Object obj) {
Class mClass = obj.getClass();
//獲取所有的public成員變量
//Field[] fields = mClass.getFields();
//獲取該類自己聲明的成員變量
Field[] fields = mClass.getDeclaredFields();
for (Field f : fields) {
Class fieldType = f.getType();
System.out.println("變量類型:" + fieldType.getName() + " 變量名:" + f.getName());
}
}
public static void getClassCon(Object obj) {
Class mClass = obj.getClass();
Constructor[] ms = mClass.getConstructors();
for (Constructor m : ms) {
Class[] paramTypes = m.getParameterTypes();
for (Class paramType : paramTypes) {
System.out.println("構造方法參數類型:" + paramType.getName());
}
}
}
}
測試類,Test2 :
public class Test2 {
public static void main(String[] args) {
//獲取類的普通方法、 成員變量、構造方法
try {
Class mClass = Class.forName("com.guofeng.Car");
Car c = (Car) mClass.newInstance();
ClassUtil.getClassMethod(c);
ClassUtil.getClassField(c);
ClassUtil.getClassCon(c);
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
}
}
輸出:
類名:com.guofeng.Car
返回類型:void
方法名:dirve
參數類型:java.lang.String
變量類型:boolean 變量名:window
變量類型:java.lang.String 變量名:wheel
構造方法參數類型:boolean
構造方法參數類型:java.lang.String
方法反射的基本操作
Test3 類:
public class Test3 {
public static void main(String[] args) {
try {
Car car = new Car();
Class c = car.getClass();
//獲取dirve方法
Method m = c.getMethod("dirve", String.class);
//方法的反射操作
m.invoke(car, "郭峯");
} catch ( NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
輸出:
郭峯:皮皮蝦,我們走!