/**每天進步一點點
*/
//該包讀取的是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");
}
}
|