Java反射的應用

weixin_34377065發表於2013-04-24

/**每天進步一點點
*/
//該包讀取的是properties檔案中的內容PersonType=com.anby.damain.Person
package com.anby.demo;
 
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
 
public class Reflect {
 
public static void main(String[] args)throws Exception {
//設定資料集
Map<String,String> dataMap=new HashMap<String,String>();
dataMap.put("name", "Anby");
dataMap.put("age", "20");
dataMap.put("sex", "man");
dataMap.put("qq", "190241347");
dataMap.put("Email", "ailaohuyou123@yahoo.com");
 
 
 
Class clzz=Class.forName(getProperties("PersonType"));//若此處報異常,說明檔案訪問許可權不夠(java.lang.IllegalAccessException)
     //獲取例項物件
     Object obj=clzz.newInstance();
     //獲取所有物件中的欄位
     Field[] field=clzz.getDeclaredFields();
     for (Field f : field)
     {
     f.setAccessible(true);
     String fieldname=f.getName();
     String value=dataMap.get(fieldname);
     if(value!=null)
     {
     f.set(obj, value);
     }
     }
     System.out.println(obj);
}
 
 
 
public static String getProperties(String key) {
//*獲取properties下的欄位
 //1,指定資原始檔名稱
   ResourceBundle rb=ResourceBundle.getBundle("Data");
   //2,獲取資原始檔中相應欄位的值
    String type=rb.getString(key);
    return type;
}
 
}
 
 
 
 
package com.anby;
 
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
//簡單瞭解反射
public class ClssDemo  {
public static void main(String[] args) throws Exception
{
Class cls=Class.forName("com.anby.Student");
   Object obj=cls.newInstance();
   Method[] m=cls.getDeclaredMethods();
   for(int i=0;i<m.length;i++)
   {
   System.out.println(m[i].getName());//方法是列印不出來結果的,只能呼叫
 
   }
    Method m1=cls.getDeclaredMethod("print",null);
   //Method m1=cls.getDeclaredMethod("print",String.class,int.class);  
    m1.invoke();//呼叫該方法
}
 
 
public static void getConstructor() throws Exception
{
String stu="com.anby.Student";
//通過位元組碼獲取類名稱 並存放到記憶體
Class clss=Class.forName(stu);
 
//獲取該類的預設建構函式
Constructor cons1=clss.getConstructor(null);
System.out.println(cons1);
 
//獲取該類的的例項 \
//兩種呼叫預設構造的方法
//1,通過建構函式Constructor物件獲取
Object obj1=cons1.newInstance(null);
//2,通過Class物件獲得
Object obj2=clss.newInstance();
 
//獲得指定引數的建構函式(包括私有)
Constructor cons2=clss.getDeclaredConstructor(String.class,Integer.class);
//設定訪問許可權
cons2.setAccessible(true);
//使用私有建構函式進行初始化
Object obj3=cons2.newInstance("asd",123);
}
 
 
public static void getField() throws Exception
{
//同理,欄位,方法,以及列舉都可以獲取
// Field[] field= clss.getDeclaredFields();
// System.out.println(field);
Class c=Class.forName("com.anby.Student");
Object obj4=c.newInstance();
 
Field namef=c.getDeclaredField("name");
Field agef=c.getDeclaredField("age");
 
namef.setAccessible(true);// 訪問私有欄位時,若不加這句話,會丟擲java.lang.IllegalAccessException
namef.set(obj4, "james");
Object namevalue= namef.get(obj4);
 
agef.get(obj4);
agef.set(obj4, 123);
Object agevalue=agef.get(obj4);
 
System.out.println(namevalue);
System.out.println(agevalue);
//設定age值
}
}
 
class Student
{
private  String name="anby";
public int age=18;
   public Student()
   {
  System.out.println("預設建構函式");
   }
   private Student(String name,Integer age)
   {
  System.out.println("帶引數的建構函式");
   }
   public void print()
   {
  System.out.println("print");
   }
}

相關文章