Java基礎學習:註解和反射13( 有了Class物件,能做什麼 )
阿新 • • 發佈:2022-03-14
-
小結:
-
在實際的操作中,取得類的資訊的操作程式碼,並不會經常開發;
-
一定要熟悉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());
}
}