1. 程式人生 > >反射機制:類中方法及成員變數賦值

反射機制:類中方法及成員變數賦值

  1. Person.java:  
  2. package test;  
  3. publicclass Person {  
  4.     private String name;  
  5.     privateint age;  
  6.     public Person(){  
  7.     }  
  8. }  
  9. Demo.java:  
  10. package test;  
  11. import java.lang.reflect.Field;  
  12. publicclass Demo {  
  13.     publicstaticvoid main(String[] args) throws Exception{  
  14.         Class<?> c=null
    ;  
  15.         Object obj=null;  
  16.         try {  
  17.             c=Class.forName("test.Person");  
  18.         } catch (ClassNotFoundException e1) {  
  19.             e1.printStackTrace();  
  20.         }  
  21.         try {  
  22.             obj=c.newInstance();  
  23.         } catch (InstantiationException e) {  
  24.             e.printStackTrace();  
  25.         } catch (IllegalAccessException e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.         Field nameField=null;  
  29.         Field ageField=null;  
  30.         nameField=c.getDeclaredField("name");  
  31.         ageField=c.getDeclaredField("age");  
  32.         nameField.setAccessible(true);  
  33.         nameField.set(obj,"軟體工程"
    );  
  34.         ageField.setAccessible(true);  
  35.         ageField.set(obj, 20);  
  36.         System.out.println("姓名:"+nameField.get(obj));  
  37.         System.out.println("年齡:"+ageField.get(obj));      
  38.     }  
  39. }  
個-person:
package com.java_reflect3;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
 * Created by Administrator on 2017/8/17.
 */
class Hello {
private static int id;
private static String name;
private static String site;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSite() {
return site;
}
public void setSite(String site) {
this.site = site;
}
//自定義方法
public void home(String sex, String age) {
System.out.println("性別:" + sex);
System.out.println("年齡:" + age);
}
}
public class ListDemoLianXi {
public static void main(String[] args) {
//類中方法引數賦值測試
        //new ListDemoLianXi().MethodTest();
        //成員變數賦值測試
variableTest();
}
/**
     * 變數賦值測試
     */
public static void variableTest() {
//建立本類物件
Hello hello = new Hello();
//建立類的例項
Class c = hello.getClass();
//建立屬性操作物件、具體屬性操作  重要:有幾個屬性必須建立幾個例項物件(要麼在你輸出的時候你有多個屬性的話,呼叫的是一個物件那 必然輸出的是一個物件的值  切記)
Field nameField = null;
Field siteField = null;
try {
//getDeclaredField:獲取你自定義變數的名稱
nameField = c.getDeclaredField("name");
siteField = c.getDeclaredField("site");
//屬性name賦值:
nameField.setAccessible(true);
nameField.set(hello, "諾小華!");
//屬性site賦值: setAccessible(true);作用: 將此物件的 accessible 標誌設定為指示的布林值。值為 true 則指示反射的物件在使用時應該取消 Java 語言訪問檢查。值為 false 則指示反射的物件應該實施 Java 語言訪問檢查。
siteField.setAccessible(true);
siteField.set(hello, "天津市津南區小站");
System.out.println("姓名:" + nameField.get(hello));
System.out.println("地址:" + siteField.get(hello));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
    }
/**
     * 類中的方法(引數)賦值測試
     */
public void MethodTest() {
//建立物件
Hello hello1 = new Hello();
//建立Class類物件
Class c = hello1.getClass();
//使用反射進行給具體方法引數賦值
try {
Method method = c.getMethod("home", String.class, String.class);
//invoke引數錯誤:object is not an instance of declaring class  如果把前面的Object引數傳為字串型別,會丟擲該異常,必須是你實體類的物件即可
method.invoke(hello1, "男生", "2 1");//args可以參多個引數
            //打印出的方法中引數的類型別資訊
System.out.println("home內容為:" + method);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
    }
}