獲取class對象的三種方法以及通過Class對象獲取某個類中變量,方法,訪問成員


public class ReflexAndClass {

    public static void main(String[] args) throws Exception {
        
        /**
         * 獲取Class對象的三種方式
         * 1 Object ——> getClass();
         * 2 任何數據類型(包括基本數據類型)都有一個靜態的class屬性
         * 3 通過Class類的靜態方法:forName(String  className)(常用)
         * 
         * 
         * 注意:在運行期間,一個類,只有一個Class對象產生。
         * 三種方式常用第三種,第一種對象都有了還要反射干什么。第二種需要導入類的包,依賴太強,不導包就拋編譯錯誤。
         * 一般都第三種,一個字符串可以傳入也可寫在配置文件中等多種方法。
         * @throws Exception 
         */
        //第一種  getClass
        Student stu = new Student();
        Class stuClass1 = stu.getClass();
        System.out.println(stuClass1.getName());
        //第二種 class屬性
        Class stuClass2 = Student.class;
        System.out.println(stuClass2==stuClass1);
        //第三種
        try {
            Class stuClass3 = Class.forName("reflex.Student");//student的路徑
            System.out.println(stuClass3);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        
       /**通過Class對象可以獲取某個類中的:構造方法、成員變量、成員方法;並訪問成員;
         * 
         * 1.獲取構造方法:
         *         1).批量的方法:
         *             public Constructor[] getConstructors():所有"公有的"構造方法
         *          public Constructor[] getDeclaredConstructors():獲取所有的構造方法(包括私有、受保護、默認、公有)
         *    
         *         2).獲取單個的方法,並調用:
         *             public Constructor getConstructor(Class... parameterTypes):獲取單個的"公有的"構造方法:
         *             public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個構造方法"可以是私有的,或受保護、默認、公有;
         *         
         *             調用構造方法:
         *             Constructor-->newInstance(Object... initargs)
         *         獲取私有的構造方法的時候需要使用setAccessible設置訪問權限為true才能進行構造,否則出現異常
         */
        
        Class<?> clazz = Class.forName("reflex.Student");
        Constructor[] public1 = clazz.getConstructors();
        System.out.println("公有構造方法");
        for(Constructor con : public1){
            System.out.println(con);
        }
        
        Constructor[] public2 = clazz.getDeclaredConstructors();
        System.out.println("所有構造方法");
        for(Constructor con : public2){
            System.out.println(con);
        }
        
        Constructor con = clazz.getConstructor(null);
        System.out.println("公有無參:" + con);
        
        Constructor cons = clazz.getDeclaredConstructor(String.class);
        System.out.println("所有無參公有構造方法"+cons);
        
        Object name = clazz.getDeclaredConstructor(String.class).newInstance("chen");
        Student s = new Student();
        System.out.println("名稱為:" + name);
                
        //調用構造方法
        Object obj = con.newInstance();
//        System.out.println("obj = " + obj);
//        Student student = (Student)obj;
        
    }
    
}
public class Student {
    
        //---------------構造方法-------------------
        //(默認的構造方法)
        Student(String str){
            System.out.println("(默認)的構造方法 s = " + str);
        }
        
        //無參構造方法
        public Student(){
            System.out.println("調用了公有、無參構造方法執行了。。。");
        }
        
        //有一個參數的構造方法
        public Student(char name){
            System.out.println("姓名:" + name);
        }
        
        //有多個參數的構造方法
        public Student(String name ,int age){
            System.out.println("姓名:"+name+"年齡:"+ age);//這的執行效率有問題,以后解決。
        }
        
        //受保護的構造方法
        protected Student(boolean n){
            System.out.println("受保護的構造方法 n = " + n);
        }
        
        //私有構造方法
        private Student(int age){
            System.out.println("私有的構造方法   年齡:"+ age);
        }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM