樂字節Java反射之四:反射相關操作

大家好,樂字節小樂繼續爲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知識技術分享,樂字節原創

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章