1. 程式人生 > 其它 >Java基礎學習:註解和反射13( 有了Class物件,能做什麼 )

Java基礎學習:註解和反射13( 有了Class物件,能做什麼 )

Java基礎學習:註解和反射13

  • 小結:

    • 在實際的操作中,取得類的資訊的操作程式碼,並不會經常開發;

    • 一定要熟悉java.lang.reflect包的作用,反射機制;

    • 如何取得屬性,方法,構造器的名稱,修飾符等;

       

  • 有了Class物件,能做什麼?

    • 建立類的物件:呼叫Class物件的newInstance()方法;

      • 類必須有一個無參構造器;

      • 類的構造器的訪問許可權需要足夠;

    • 問題:難道沒有無參的構造器就不能建立物件了嗎?只要在操作的時候明確的呼叫類重點構造器,並將引數傳遞進去之後,才可以例項化操作;

      • 通過Class類的getDeclaredConstructor(Class。。parameterType)取得本類的指定形參型別的構造器;

      • 向構造器的形參中傳遞一個物件陣列進去,裡面包含了構造器中所需的各個引數;

      • 通過Constructor例項化物件

 

 

  • 程式碼案例:


    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    //
    public class Test01 {
       public static void main(String[] args) throws Exception {

           //獲得Class物件
           Class c1 = Class.forName("com.demo.demo03.Son");
           /*Class c1 = Class.forName("com.demo.demo03.Son");
           System.out.println(c1);
           //構造一個物件
           Son son = (Son) c1.newInstance();//本質是呼叫了無參構造
           System.out.println(son);


           //通過構造器建立物件
           Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
           Son son1 = (Son)constructor.newInstance("haha", 1, 1);
           System.out.println(son1);*/

           //通過反射呼叫普通方法
           Son son = (Son) c1.newInstance();
           //通過反射獲取一個方法
           Method setName = c1.getDeclaredMethod("setName", String.class);
           //invoke():啟用,執行
           //(物件:方法的值)
           setName.invoke(son,"haha");
           System.out.println(son.getName());


           //通過反射獲取屬性
           Son son1 = (Son) c1.newInstance();
           Field name = c1.getDeclaredField("name");
           //不能直接操作私有屬性,需要關閉程式的安全檢測,屬性或者方法是setAccessible(true)
           name.setAccessible(true);//關掉
           name.set(son1,"haha2");
           System.out.println(son1.getName());


      }
    }