反射和配置文件的实际应用
生活随笔
收集整理的這篇文章主要介紹了
反射和配置文件的实际应用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.利用反射完成不同參數(shù)賦值
<1>無參構(gòu)造[默認賦值]
Student 和 Teacher皆為JavaBean類
<2>有參構(gòu)造
public class Demo2 {public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {Student obj1 = new Student();//把Student對象的屬性名和屬性值,存儲Map集合HashMap<String, Object> map1 = new HashMap<>();map1.put("name", "張三");map1.put("age", 20);//調(diào)用方法給Student對象的屬性賦值populate(obj1, map1);Teacher obj2 = new Teacher();//把Teacher對象的屬性名和屬性值,存儲Map集合HashMap<String, Object> map2 = new HashMap<>();map2.put("name", "李四");map2.put("age", 30);map2.put("salary", 15000);//調(diào)用方法給Teacher對象的屬性賦值populate(obj2, map2);}private static void populate(Object obj, HashMap<String, Object> map) throws IllegalAccessException, NoSuchFieldException {//1.通過getClass()方法獲取obj的字節(jié)碼Class<?> clazz = obj.getClass();//2.獲取字節(jié)碼所有成員變量(包括私有的)//注意:成員變量的名稱就是map集合中的每一個鍵Set<String> keys = map.keySet();Field[] declaredFields = clazz.getDeclaredFields();for (String key : keys) {for (int i = 0; i < declaredFields.length; i++) {Field declaredField = declaredFields[i];//3.使用暴力反射給所有的成員變量賦值//注意:成員變量的值就是map集合中鍵對應的值declaredField.setAccessible(true);if (key.equals(declaredField.getName())) {declaredField.set(obj, map.get(key));}}}System.out.println(obj);} }打印結(jié)果: ------------------------------------------------------------------------ Student{name='張三', age=20} Teacher{name='李四', age=30, salary=15000}2.反射與XML解析
[通過改配置文件執(zhí)行對應類的方法]
要求:使用Dom4j解析config.xml配置文件。然后執(zhí)行Student類中的study方法
XML文件
<?xml version="1.0" encoding="UTF-8" ?> <config><classname>com.itheima1.Student</classname><method><!--方法的參數(shù)名稱--><methodName>study</methodName><!--方法的參數(shù)類型,需要些類的全類名--><paramType>java.lang.String</paramType><!--調(diào)用方法時傳遞的參數(shù)值--><paramValue>Java基礎課程</paramValue></method><method><!--方法的參數(shù)名稱--><methodName>teach</methodName><!--方法的參數(shù)類型[引用數(shù)據(jù)類型],需要些類的全類名--><paramType>java.lang.String</paramType><!--調(diào)用方法時傳遞的參數(shù)值--><paramValue>Java基礎課程</paramValue> </method> </config>測試類
public class Demo4 {public static void main(String[] args) throws Exception {//使用Dom4j解析config.xml配置文件SAXReader saxReader = new SAXReader();Document document = saxReader.read("day17_myXml\\src\\com\\zuoye\\xml\\config.xml");//讀取方法的名稱,參數(shù)類型,參數(shù)值List<Element> elements = document.getRootElement().elements("method");for (Element element : elements) {//讀取文件路徑String classname = document.getRootElement().element("classname").getText();String method = element.element("methodName").getText();String paramType = element.element("paramType").getText();String paramValue = element.element("paramValue").getText();//反射執(zhí)行Student類中的study方法Class<?> clazz = Class.forName(classname);Student student = (Student) clazz.getConstructor().newInstance();Class<?> paramTypeClazz = Class.forName(paramType);Method method1 = clazz.getMethod(method, paramTypeClazz);method1.invoke(student, paramValue);}} }//學生類 public class Student {public void study(String s){System.out.println("學生在學習"+s);}public void teach(String s){System.out.println("老師教學生"+s);} }打印結(jié)果: --------------------------------------------------------- 學生在學習Java基礎課程 老師教學生Java基礎課程3.反射與注解
//學生類 public class Student {public void study(){System.out.println("學生在努力學習");} }//自定義注解 @Retention(RetentionPolicy.RUNTIME) //注解在運行時期有效 @Target(ElementType.TYPE) //注解可以使用在類上 public @interface Anno {public String classname();public String methodname();//value 成員變量只有一個,則可以省略名稱直接賦值 }//配置文件 @Anno(classname = "com.itheima3.Student", methodname = "study") public class Config { }//測試類 public class Demo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {//加載ConfigClass<?> configClazz = Class.forName("com.itheima3.Config");//獲取Anno注解的屬性值Anno anno = configClazz.getAnnotation(Anno.class);String classname = anno.classname();String methodname = anno.methodname();//System.out.println(classname);//通過反射獲取classname對應的字節(jié)碼Class<?> clazz = Class.forName(classname);Object o = clazz.getConstructor().newInstance();//獲取methodname對應的方法Method method = clazz.getMethod(methodname);//執(zhí)行方法method.invoke(o);} }打印結(jié)果: ------------------------------------------------------------------------- 學生在努力學習 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的反射和配置文件的实际应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三国志2安卓版(三国志2安卓)
- 下一篇: 单元测试和日志技术