大家好,樂字節小樂繼續爲Java初學者講述Java基礎知識。上次說到樂字節Java反射之三:方法、數組、類加載器,這次是Java反射之四:反射相關操作
1、操作屬性
//1、獲取Class對象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、獲取對象
User u=(User)clz.newInstance();
//3、設置屬性
Field field=clz.getDeclaredField("uname");
field.setAccessible(true);//打開權限
field.set(u, "0523");
//4、獲取此屬性
System.out.println(field.get(u));
2、調用方法
調用方法,都是直接對象.方法([實參]);反射之後,動態調用方法需要使用 invoke即可。
1)、方法調用
//1、獲取Class對象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、獲取對象
User u=(User)clz.newInstance();
//3、獲取方法
Method m =clz.getMethod("coding", String.class,String.class);
//4、成員方法的調用
m.invoke(u, "反射","多個參數");
//若是靜態方法,傳遞null即可 因爲靜態方法屬性類,不屬於對象
m=clz.getMethod("testStatic",int.class);
m.invoke(null, 100);//與對象無關
2)、操作setter與getter訪問器
/**
* @param obj 操作的對象
* @param att 操作的屬性
* @param value 設置的值
* */
public static void setter(Object obj, String att,Object value) {
try {
//setUname setUpwd -->第一個字母大寫
att=att.substring(0,1).toUpperCase()+att.substring(1);
Method method = obj.getClass().getMethod("set" + att, value.getClass());
method.invoke(obj, value);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object getter(Object obj, String att) {
try {
//getUname getUpwd -->第一個字母大寫
att=att.substring(0,1).toUpperCase()+att.substring(1);
Method method = obj.getClass().getMethod("get" + att);
return method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
main方法
//1、獲取Class對象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、獲取對象
User u=(User)clz.newInstance();
//3、設置值
setter(u,"uname","shsxt");
//獲取值
String str=(String) getter(u,"uname");
System.out.println(str);
3、利用反射編寫簡單工廠設計模式
利用反射+配置文件可以實現簡單工廠模式。
interface Car{
void run();
}
class Bmw implements Car{
public void run(){
System.out.println("小樣,學的怎麼樣");
}
}
class QQ implements Car{
public void run(){
System.out.println("大哥,救我");
}
}
class Benz implements Car{
public void run(){
System.out.println("哈哈");
}
}
//簡單工廠
class CarFactory{
public static Car product2(String carStr){
if(carStr.equals("qq")){
return new QQ();
}else if(carStr.equals("benz")){
return new Benz();
}
//如有其它車輛,需要添加代碼
return null;
}
/**
* 根據字符串 創建對象
* @param carStr
* @return
*/
public static Car product(String carStr){
try {
return (Car)Class.forName(carStr).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
#car.properties
qq=com.shsxt.ref.simplefactory.QQ
benz=com.shsxt.ref. simplefactory.Benz
bmw=com.shsxt.ref. simplefactory.Bmw
public static void main(String[] args) throws Exception {
//加載配置文件
Properties pro =new Properties();
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("car.properties"));
//獲取對應的 完整路徑(報名.類名)
String clz =pro.getProperty("qq");
CarFactory.product(clz).run();
}
Java反射相關知識就講到這裏了,下次我們進入到JavaSE的課程:循環控制
請繼續關注樂字節,Java知識技術分享,樂字節原創