java 反射基本使用

概述:

JAVA程序在運行狀態中,通過Java的反射機制,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性。這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。

git示例代碼地址

獲取Class對象方法:

通過Class.forName()靜態方法獲取;

Class peopleClz;
        try {
            peopleClz = Class.forName("model.People");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

通過對象的getClass()方法;

    People people = new People();
    Class <?>clazz = people.getClass();

java中任意類.class屬性:

        Class clazz = People.class;
        Class clazz1 = String.class;

反射獲取屬性:

父類Animal.java

public class Animal {
    public int type;
    private void move(){

    }

    public void eat(){

    }

}

子類People.java


public class People  extends Animal{


    private String address;

    int sex;

    protected String name;

    public int age;


    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private void testReflec(){

        System.out.println("測試反射");

    }

}

獲取屬性示例代碼:

public class TestReflection {


    public static void main(String args []){

        Class peopleClz = null;
        try {
            peopleClz = Class.forName("model.People");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //獲取People類所有共有屬性:
        Field allPFields[] = peopleClz.getFields();
        System.out.println("所有公有屬性(包含父類):");
        for(Field field :allPFields){

            System.out.println(field);

        }
        //獲取指定公有屬性
        try {
            Field ageField = peopleClz.getField("age");
            System.out.println("指定公有屬性:\n"+ageField);

        } catch (NoSuchFieldException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //獲取指定屬性:
        try {
            Field addressField = peopleClz.getDeclaredField("address");
            System.out.println("獲取指定任意屬性:\n"+addressField);
        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //獲取People類所有屬性(不能獲取父類):
        Field allFields[] = peopleClz.getDeclaredFields();
        System.out.println("所有屬性(不包含父類):");
        for(Field field :allFields){

            System.out.println(field);

        }

    }
}

輸出:
這裏寫圖片描述

反射獲取方法:

獲取方法示例代碼:

public class TestReflection {


    public static void main(String args []){

        Class peopleClz = null;
        try {
            peopleClz = Class.forName("model.People");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //獲取所有公有方法
        Method methods [] = peopleClz.getMethods();
        System.out.println("獲取所有公有方法(包含父類):");
        for(Method method:methods){

            System.out.println(method);

        }

        //獲取指定公有方法
        System.out.println("獲取指定公有方法:");
        try {
        Method setSex =     peopleClz.getMethod("setSex", int.class);
        System.out.println(setSex);     

        Method getSex =     peopleClz.getMethod("getSex", null);
        System.out.println(getSex);     

        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //獲取本類聲明方法

        Method dMethods [] = peopleClz.getDeclaredMethods();
        System.out.println("獲取本類所有方法(不包含父類):");
        for(Method method:dMethods){

            System.out.println(method);

        }
        //獲取本類指定方法
            System.out.println("獲取指定聲明方法:");
                try {

                Method testReflec =peopleClz.getDeclaredMethod("testReflec", null);
                System.out.println(testReflec);     

                } catch (NoSuchMethodException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SecurityException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
        }
    }

運行結果:
這裏寫圖片描述
後續:
這裏寫圖片描述

反射獲取構造方法:

獲取構造方法示例代碼:

public class TestReflection {


    public static void main(String args []){

        Class peopleClz = null;
        try {
            peopleClz = Class.forName("model.People");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Constructor cons [] = peopleClz.getConstructors();
        System.out.println("獲取所有公有構造方法(不包含父類)");
        for(Constructor con:cons){

            System.out.println(con);
        }
        System.out.println("獲取指定公有構造方法(不包含父類)");
        try {
            Constructor con1 = peopleClz.getConstructor(null);
            System.out.println(con1);
            Constructor con2 = peopleClz.getConstructor(int.class,String.class);
            System.out.println(con2);
        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("獲取指定構造方法");
        try {

            Constructor con3 = peopleClz.getDeclaredConstructor(int.class,String.class,int.class);
            System.out.println(con3);

        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Constructor dCons [] = peopleClz.getDeclaredConstructors();
        System.out.println("獲取所有構造方法");
        for(Constructor con:dCons){

            System.out.println(con);
        }           
    }
}

運行結果:
這裏寫圖片描述

反射使用示例:

public class TestReflection {


    public static void main(String args []){

        Class peopleClz = null;
        try {
            peopleClz = Class.forName("model.People");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //調用構造方法生成對象
        People people1=null;
        People people2 =null;
        try {
        //反射生成對象
            System.out.println("------------------------------------------------------------------------");
            System.out.println("反射生成對象:");
        //公有構造方法生成對象:
        Constructor con1=   peopleClz.getConstructor(int.class,String.class);
        people1 = (People)  con1.newInstance(10,"weiwei");
        System.out.println("名字="+people1.getName());
        //非公有構造方法生成對象:
        Constructor con2=   peopleClz.getDeclaredConstructor(int.class,String.class,int.class);
        //注意調用私有構造方法一定要設置下面語句爲true,否則報異常java.lang.IllegalAccessException;
        con2.setAccessible(true);
        people2 = (People) con2.newInstance(10,"wenwen",-100);
        System.out.println("名字="+people2.getName()+"\tsex ="+people2.getSex());

        //反射操作對象屬性
        System.out.println("------------------------------------------------------------------------");
        System.out.println("反射操作對象屬性:");
        try {
            Field field1 = peopleClz.getDeclaredField("sex");
            //sex訪問權限爲defalut,需要設置下面語句爲true。
            field1.setAccessible(true);
            field1.set(people2, 100);
            System.out.println("sex ="+people2.getSex());

            Field field2 = peopleClz.getDeclaredField("address");
            field2.setAccessible(true);
            field2.set(people2, "Beijing in China");
            System.out.println("address ="+field2.get(people2));


        } catch (NoSuchFieldException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //反射操作對象方法
        System.out.println("------------------------------------------------------------------------");
        System.out.println("反射操作對象方法:");

        Method method1 = peopleClz.getDeclaredMethod("setName", String.class);
        Method method2 = peopleClz.getDeclaredMethod("getName");
        method1.invoke(people2, "王小波!");
        Object objString = (String) method2.invoke(people2);
        System.out.println(objString);

        Method method3= peopleClz.getDeclaredMethod("testReflec");
        method3.setAccessible(true);
        method3.invoke(people2, null);

        } catch (NoSuchMethodException | SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }                   
    }
}

運行結果:
這裏寫圖片描述

希望對您有所幫助!

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