標籤:-- object access 構造 產生 color edm person new
反射的前提是擷取當要反射類的Class對象,擷取方式有如下幾種:
1 //使用Class.forName 2 Class c = Class.forName("com.test.Person"); 3 //使用Class屬性 4 Class c = Person.class; 5 //使用getClass 6 Person p = new Person(); 7 Class c = p.getClass(); 8 //擷取基本類型的class可以使用如下方式 9 Class c = int.class;//輸出 int10 Class c = Integer.TYPE;//輸出 int11 Class c = Integer.class;//輸出 java.lang.Integer
接著建立要反射的類Person
1 class Person { 2 private String name; 3 private int age; 4 //無參構造方法 5 public Person(){ 6 7 } 8 //有參建構函式 9 public Person(String name, int age) {10 this.name = name;11 this.age = age;12 }13 //輸出資訊14 private void getInfo() {15 System.out.println(name + "\t" + age);16 }17 //私人方法18 private void privateMethod() {19 System.out.println("調用了private方法");20 }21 //私人靜態方法22 private static void getStaticPrivateMethod(){23 System.out.println("getStaticPrivateMethod");24 }25 26 //public方法27 public void getPublicMethod(){28 System.out.println("getPublicMethod");29 }30 31 //public靜態方法32 public static void pubicStaticMethod() {33 System.out.println("調用了public static方法");34 }35 //帶有參數的公用靜態方法36 public static void getMsg(String msg){ 37 System.out.println(msg);38 }39 40 }
1.反射私人方法
1 // 反射Person類中的private方法 2 Class clazz = Class.forName("com.test.Person"); 3 // 建立Person類的執行個體,前提是Person有一個無參構造方法 4 Person person = (Person) clazz.newInstance(); 5 // 擷取Method,使用getDeclaredMethod是對私人方法進行訪問,但是必須設定setAccessible為true 6 Method method = clazz.getDeclaredMethod("privateMethod"); 7 // 這是在訪問私人方法時不對安全性進行檢查 8 method.setAccessible(true); 9 // 調用person類中的getAge方法10 method.invoke(person);
2.反射私人靜態方法
//擷取Person的Class對對象Class c = Person.class;//擷取要調用的方法,這裡需要有getDeclareMethod來擷取類的私人方法Method m = c.getDeclaredMethod("getStaticPrivateMethod")//設定私人方法的可訪問性為truem.setAccessible(true);//調用m.invoke(c);
3.反射公用方法
//擷取Class對象Class c = Person.class;//構建Person對象(前提是Person有一個無參構造方法)Person person = (Person) c.newInstance();//擷取要調用的方法Method method = c.getMethod("getPublicMethod");//調用person對象中的方法method.invoke(person);
4.反射公用靜態方法
//擷取Class對象Class cc = Person.class;//擷取要調用的方法Method method = cc.getMethod("pubicStaticMethod");//調用方法,因為是static方法,所以直接通過類來調用method.invoke(cc);
5.反射帶有參數的公用靜態方法
//擷取ClassClass c = Person.class;//擷取Method,要傳遞參數的Class對象數組,一個參數的情況也可以直接傳class,如 String.classMethod method = c.getMethod("getMsg",new Class[]{String.class});method.invoke(c,"不能說的秘密");
6.反射有參建構函式的私人方法
//擷取ClassClass c = Person.class;//構建有參構造方法Constructor constructor = c.getConstructor(new Class[]{String.class, int.class});//通過constructor擷取Person對象執行個體Person person = (Person) constructor.newInstance(new Object[]{"Liusilong", 18});// 這裡getInfo如果是public方法的話就直接 person.getInfo();// 如果getInfo是private方法就就還需要反射私人方法,步驟如下:Method method = c.getDeclaredMethod("getInfo");method.setAccessible(true);method.invoke(person);
7.反射屬性並輸出
// 擷取Class對象 Class c = Person.class;// 產生Person類的執行個體 Person p = (Person) c.newInstance();// 擷取Person類中的私人屬性 Field name = c.getDeclaredField("name"); Field age = c.getDeclaredField("age");// 設定私人屬性可訪問 name.setAccessible(true); age.setAccessible(true);// 設定Person對象中私人屬性的值 name.set(p, "Liusilong"); age.set(p, 18);// 擷取Person中的私人方法 getInfo Method method = c.getDeclaredMethod("getInfo");// 設定私人方法可訪問 method.setAccessible(true);// 調用私人方法 method.invoke(p);
Java--反射