Java反射的應用

來源:互聯網
上載者:User
/**每天進步一點點
*/
//該包讀取的是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.IllegalAccessExceptionnamef.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");   }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.