日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射和配置文件的实际应用

發(fā)布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射和配置文件的实际应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.利用反射完成不同參數(shù)賦值

<1>無參構(gòu)造[默認賦值]
Student 和 Teacher皆為JavaBean類

public class Demo1 {public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {//創(chuàng)建老師對象Teacher teacher = creatInstance(Teacher.class);System.out.println(teacher);//獲取學生對象Student student = creatInstance(Student.class);System.out.println(student);}//需求:寫一個方法:能夠創(chuàng)建任何類的對象,并把對象返回private static <T>T creatInstance(Class<T> clazz) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//獲取空參構(gòu)造【通用】Constructor<T> constructor = clazz.getDeclaredConstructor();constructor.setAccessible(true);T t = constructor.newInstance();return t;} }打印結(jié)果: ----------------------------------------------------------------------- public...Teacher...無參構(gòu)造方法 Teacher{name='null', age=0} public...Student...無參構(gòu)造方法 Student{name='null', age=0}

<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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。