為了回憶起來,於是重新找了幾道練習題做了下
package cn.incast.homework30;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Scanner;
public class Reflect {
public static void main(String[] args) throws Exception {
// fanxingDemo();
// newObject1();
// newObject2();
// printStr();
// showObj();
// setProperty(new Person(), "name", "張三");
// beanDemo();
// run();
// System.out.println(getProperty(new Person(), "age"));
}
// 8. 寫一個方法,此方法可以獲取obj對象中名為propertyName的屬性的值
public static Object getProperty(Object obj, String propertyName)throws Exception {
Class c =obj.getClass();
Field f =c.getDeclaredField(propertyName);
f.setAccessible(true);
Object fValue = f.get(obj);
// System.out.println(fValue);
return fValue;
}
// 7.(1)寫一個Properties格式的配置文件,配置類的完整名稱。
// (2) 寫一個程序,讀取這個Properties配置文件,獲得類的完整名稱並加載這個類,
// (3)用反射 的方式運行run方法。
private static void run() throws Exception {
Properties pro = new Properties();
// 注意:如果是用Eclise的話,切記要右鍵工程名字,新建一個file文件,因為如果file文件不在工程根目錄的話,它是找不到的。
FileReader fr = new FileReader("config.properties");
pro.load(fr);
fr.close();
String className = pro.getProperty("className");
String MethodName = pro.getProperty("MethodName");
Class c = Class.forName(className);
Object obj = c.newInstance();
Method method = c.getMethod(MethodName);
method.invoke(obj);
}
// 6.定義一個標准的JavaBean,名叫Person,包含屬性name、age。
// 使用反射的方式創建一個實例、調用構造函數初始化name、age,使用反射方式調用setName方法對名稱進行設置,
// 不使用setAge方法直接使用反射方式對age賦值。
private static void beanDemo() throws Exception {
Class c = Class.forName("cn.incast.homework30.Person");
Constructor con = c.getConstructor(String.class, int.class);
Object obj = con.newInstance("小明", 16);
c.getMethod("setName", String.class).invoke(obj, "小麗");// 反射方式調用setName方法對名稱進行設置
Field f = c.getDeclaredField("name");
f.setAccessible(true);
System.out.println(obj);
}
// 5. 寫一個方法,此方法可將obj對象中名為propertyName的屬性的值設置為value.
public static void setProperty(Object obj, String propertyName, Object value)
throws Exception {
Class c = obj.getClass();
Field f = c.getDeclaredField(propertyName);// 獲得包括私有和公有的屬性
f.setAccessible(true);// 還要配合這個,取消權限檢查,才能設置屬性
f.set(obj, value);
System.out.println(obj);
}
// 4.編寫一個類A,增加一個實例方法showString,用於打印一條字符串,在編寫一個類TestA
// ,作為客戶端,用鍵盤輸入一個字符串,該字符串就是類A的全名,
// 使用反射機制創建該類的對象,並調用該對象中的方法showString
private static void showObj() throws Exception {
Scanner s = new Scanner(System.in);
System.out.println("輸出一個類的全名");
Class c = Class.forName(s.nextLine());
Object obj = c.newInstance();
Method method = c.getMethod("showString");
method.invoke(obj);
}
// 3. 編寫一個類,增加一個實例方法用於打印一條字符串。並使用反射手段創建該類的對象, 並調用該對象中的方法。
private static void printStr() throws Exception {
Class c = Class.forName("cn.incast.homework30.Person");
// Person p = new Person();
Object p = c.newInstance();
Method method = c.getMethod("print");
method.invoke(p);
}
// 2. 用反射去創建一個對象,有2種方式,盡量用代碼去體現
private static void newObject1() throws Exception {
Class c = Class.forName("cn.incast.homework30.Person");
Constructor cons = c.getConstructor(String.class, int.class);
Object obj = cons.newInstance("小明", 20);
System.out.println(obj);
}
private static void newObject2() throws Exception {
Class c = Class.forName("cn.incast.homework30.Person");
Object obj = c.newInstance();
System.out.println(obj);
}
// 1.泛型類型擦除
private static void fanxingDemo() throws Exception {
ArrayList<String> array = new ArrayList<String>();
array.add("begin");
Class c = Class.forName("java.util.ArrayList");
Method method = c.getMethod("add", Object.class);
method.invoke(array, 20);
for (Object obj : array) {
System.out.println(obj);
}
}
}