JAVA學習筆記(六十一)- 反射Reflection

來源:互聯網
上載者:User

標籤:reflection   反射   通過反射訪問構造方法   

反射Reflection
import java.lang.reflect.Modifier;/* * 反射Reflection * java.lang.Class類 */public class Test01 {    public static void main(String[] args) {        String name = "tom";        // 方式一:通過對象getClass()方法        // 任意一個類的對象,都有一個getClass()方法        // 可以通過此擷取擷取當前對象的類型所對應的Class對象        Class cls = name.getClass();        showInfo(cls);        //方式二:通過Class類的forName()靜態方法        try {            Class cls2=Class.forName("com.itany.basejava.day37.Test01");            showInfo(cls2);        } catch (ClassNotFoundException e) {            e.printStackTrace();        }        //方式三:通過指定類的class屬性        Class cls3=Student.class;        showInfo(cls3);    }    // 擷取Class對象的相關資訊    public static void showInfo(Class cls) {        System.out.println("類的全名:" + cls.getName());        System.out.println("類名:" + cls.getSimpleName());        System.out.println("所屬包:" + cls.getPackage());        System.out.println("是否為本地類:" + cls.isLocalClass());        System.out.println("是否為介面:" + cls.isInterface());        System.out.println("是否為數組:" + cls.isArray());        System.out.println("是否為基礎資料型別 (Elementary Data Type):" + cls.isPrimitive());        // 擷取其父類的Class對象        Class superCls = cls.getSuperclass();        System.out.println("父類的全名:" + superCls.getName());        // 擷取類的修飾符        int m = cls.getModifiers();        System.out.println("修飾符為:");        if (Modifier.isPublic(m)) {            System.out.print("public ");        }        if (Modifier.isStatic(m)) {            System.out.print("static ");        }        if (Modifier.isAbstract(m)) {            System.out.print("abstract ");        }        if (Modifier.isFinal(m)) {            System.out.print("final ");        }        System.out.println("**************************************\n");    }}
通過反射訪問構造方法,執行個體化對象
import java.lang.reflect.Constructor;import java.lang.reflect.Method;/* * 通過反射訪問構造方法,執行個體化對象 * Constructor類 */public class Test03 {    public static void main(String[] args) throws Exception {        // 建立一個Dog類的對象        // Dog dog1=new Dog("大黃", 3, "男");        // 建立一個Dog類的Class對象        Class<Dog> cls = Dog.class;        /*         * 執行個體化無參建構函式的對象,兩種方式         */        // 1.通過Class對象的newInstance()方法建立執行個體,只適用於通過無參構造方法建立對象        Dog dog = (Dog) cls.newInstance();        // dog.show();        Method method = cls.getDeclaredMethod("show");        method.invoke(dog);        System.out.println("*************************\n");        // 2.擷取參數為空白的構造方法        Constructor c = cls.getDeclaredConstructor();        Dog dog2 = (Dog) c.newInstance();        dog2.show();        System.out.println("*************************\n");        /*         * 執行個體化帶參構造方法的對象         */        Constructor c2 = cls.getDeclaredConstructor(new Class[] { String.class,                int.class, String.class });        Dog dog3 = (Dog) c2.newInstance("小黃", 2, "女");        dog3.show();        /*         * 通過private修飾的構造方法執行個體化對象         */        Constructor<Dog> c3 = cls.getDeclaredConstructor(new Class[] {                String.class, String.class });        c3.setAccessible(true);        Dog dog4=c3.newInstance("巨黃","中");        dog4.show();    }}/* * Animal父類 */class Animal {    public String name;    int age;    public Animal() {        System.out.println("父類無參的構造方法");    }    public Animal(String name, int age) {        this.name = name;        this.age = age;        System.out.println("父類中帶參的構造方法");    }    public void show() {        System.out.println("父類中的show方法");    }}/* * Dog類,繼承自Animal */class Dog extends Animal {    String sex;    public Dog() {        System.out.println("子類中無參的構造方法");    }    public Dog(String name, int age, String sex) {        System.out.println("子類中帶參的構造方法");    }    private Dog(String name, String sex) {        System.out.println("子類中帶兩個參數的構造方法");    }    // 重寫父類中的show方法    public void show() {        System.out.println("子類中的show方法");    }}
Field類
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/* * Field類 */public class Test02 {    public static void main(String[] args) throws SecurityException,            NoSuchFieldException, IllegalArgumentException,            IllegalAccessException, NoSuchMethodException, InvocationTargetException {        // 建立一個Student類的對象,即學生對象        Student stu1 = new Student();        Student stu2 = new Student();        // 建立一個Student類對象,即Student類的Class對象        Class cls = Student.class;        /*         * Field屬性操作;         */        // 1.擷取Student類中的所有屬性,包含本類和父類中所有public修飾的所有屬性        // Field[] fields = cls.getFields();        // 2.擷取Student類中的所有屬性,包含本類中的任意修飾符修飾的所有屬性        Field[] fields = cls.getDeclaredFields();        for (Field f : fields) {            System.out.println(f.getName());            // System.out.println(f.toString());        }        System.out.println("**********************\n");        // 3.擷取Student類中指定的屬性        Field name = cls.getField("name");        Field grade = cls.getDeclaredField("grade");        Field sex = cls.getSuperclass().getDeclaredField("sex");        // 為屬性賦值        // stu1.name="tom";//直接通過對象名.屬性名稱賦值        name.set(stu1, "alice");// 為指定對象的屬性賦值        System.out.println("stu1的name:" + name.get(stu1));        // 設定屬性為可訪問,即設定存取修飾詞        grade.setAccessible(true);        grade.set(stu1, 2);// 為stu1的私人屬性grade賦值        System.out.println("stu1的grade:" + grade.get(stu1));        System.out.println("*****************************************\n");        /*         * Method方法操作         */        // 1.擷取Student類中所有的方法        //Method[] methods = cls.getMethods();        Method[] methods=cls.getDeclaredMethods();        for (Method m : methods) {            System.out.println(m.getName());        }        // 2.擷取Student類中指定的方法        //stu1.calc(10, 25);        Class[] args1={int.class,double.class};        Method calc=cls.getMethod("calc", args1);        Object[] args2={10,25.4};        double sum=(Double) calc.invoke(stu1, args2);        System.out.println("兩數之和為:"+sum);        //擷取private修飾的方法        Method show=cls.getDeclaredMethod("show");        show.setAccessible(true);//不檢測存取修飾詞        show.invoke(stu2);//調用方法    }}/* * Person類 */class Person {    public String name;    int age;    private String sex;    protected double height;}/* * Student類,繼承自Person */class Student extends Person {    public int id;// 學號    private int grade;// 年級編號    String className;// 班級名稱    public Student(){    }    public int getGrade() {        return grade;    }    public void setGrade(int grade) {        this.grade = grade;    }    public int calc(int num1, int num2) {        return num1 + num2;    }    public double calc(int num1, double num2) {        return num1 + num2;    }    private void show(){        System.out.println("第六排右數第二個人有點22222");    }}

JAVA學習筆記(六十一)- 反射Reflection

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.