java 使用反射小結

簡介:

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

輸出:

郭峯:皮皮蝦,我們走!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章