1.利用反射完成不同参数赋值

<1>无参构造[默认赋值]
Student 和 Teacher皆为JavaBean类

public class Demo1 {public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {//创建老师对象Teacher teacher = creatInstance(Teacher.class);System.out.println(teacher);//获取学生对象Student student = creatInstance(Student.class);System.out.println(student);}//需求:写一个方法:能够创建任何类的对象,并把对象返回private static <T>T  creatInstance(Class<T> clazz) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {//获取空参构造【通用】Constructor<T> constructor = clazz.getDeclaredConstructor();constructor.setAccessible(true);T t = constructor.newInstance();return t;}
}打印结果:
-----------------------------------------------------------------------
public...Teacher...无参构造方法
Teacher{name='null', age=0}
public...Student...无参构造方法
Student{name='null', age=0}

<2>有参构造

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);//调用方法给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);//调用方法给Teacher对象的属性赋值populate(obj2, map2);}private static void populate(Object obj, HashMap<String, Object> map) throws IllegalAccessException, NoSuchFieldException {//1.通过getClass()方法获取obj的字节码Class<?> clazz = obj.getClass();//2.获取字节码所有成员变量(包括私有的)//注意:成员变量的名称就是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);}
}打印结果:
------------------------------------------------------------------------
Student{name='张三', age=20}
Teacher{name='李四', age=30, salary=15000}
2.反射与XML解析

[通过改配置文件执行对应类的方法]

要求:使用Dom4j解析config.xml配置文件。然后执行Student类中的study方法

XML文件

<?xml version="1.0" encoding="UTF-8" ?>
<config><classname>com.itheima1.Student</classname><method><!--方法的参数名称--><methodName>study</methodName><!--方法的参数类型,需要些类的全类名--><paramType>java.lang.String</paramType><!--调用方法时传递的参数值--><paramValue>Java基础课程</paramValue></method><method><!--方法的参数名称--><methodName>teach</methodName><!--方法的参数类型[引用数据类型],需要些类的全类名--><paramType>java.lang.String</paramType><!--调用方法时传递的参数值--><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");//读取方法的名称,参数类型,参数值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();//反射执行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);}
}打印结果:
---------------------------------------------------------
学生在学习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对应的字节码Class<?> clazz = Class.forName(classname);Object o = clazz.getConstructor().newInstance();//获取methodname对应的方法Method method = clazz.getMethod(methodname);//执行方法method.invoke(o);}
}打印结果:
-------------------------------------------------------------------------
学生在努力学习

反射和配置文件的实际应用相关推荐

  1. Java 反射将配置文件数据加载到对象属性中

    Java 反射将配置文件数据加载到对象属性中 Java 反射 可以根据类名找到相应的类,也可以将配置文件中的值加载到对应属性中. 需要用到的包:spring-core-3.1.2.Release.ja ...

  2. 反射应用二:利用反射加配置文件实现多数据库的访问

    在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容.在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库. 项目整体结构如下图所示: ...

  3. 设计模式之反射与配置文件

    为了满足"开闭原则",大部分设计模式都引入了抽象层,如工厂方法模式.抽象工厂模式.适配器模式.桥接模式.命令模式.策略模式等等.客户端代码针对抽象层编程,而在程序运行的时候再指定其 ...

  4. 机房重构 之 抽象工厂+反射+配置文件 实现数据库訪问

    重构机房已经開始三个多星期了,从刚開始的一头雾水,到如今的柳暗花明,由開始的无从下手,到如今感觉犹 如脱胎换骨了般.和两个星期前相比.如今明朗了多了,心情也好了不少. 先给大家看一下这次重构的总体架构 ...

  5. 反射通过配置文件运行的步骤

    反射配置文件 通过反射配置文件,运行配置文件中指定类的对应方法 读取Peoperties.txt文件中的数据,通过反射技术,来完成Person对象的创建 Peoperties.txt文件内容如下: c ...

  6. 通过反射运行配置文件内容

    package cn.learn.test;import java.io.FileReader; import java.lang.reflect.Constructor; import java.l ...

  7. 反射例子(配置文件)

    配置文件 className = fanshe.Student1 showInfo = show1 类student1 public class Student1 {public Student1() ...

  8. java反射 配置文件_Java反射——根据配置文件,实例化对象

    案例:根据配置文件,实例化对象 src下创建一个"配置文件"config.txt,内容如下: className=ahjava.p07reflect.Cat package ahj ...

  9. 对抽象工厂+反射+配置文件的实例理解

    第一遍学习设计模式时,总有飘飘然的感觉.<大话设计模式>这本书虽然读起来挺有趣味,也感觉比其他讲设计模式的书好理解一些.但是真要用在机房收费系统时还是费劲的.米老师讲过:思想要上移,行动要 ...

最新文章

  1. 鸿洋android屏幕适配四部曲-传送门
  2. 安卓应用在各大应用市场上架方法整理
  3. 足坛绝代双骄全面数据对比,梅西30岁以后不如C罗?
  4. b+树阶怎么确定_B站公布年度弹幕,这个排名我不太服气
  5. php+larvael,PHP+Laravel的简单应用教程【ajax的使用】
  6. Win10使用sh执行python脚本报错:Permission denied
  7. sprint test 添加事务回滚机制
  8. Chrome控制台console的各种用法(方便调试)
  9. 统计英文、数字、空格以及其他字符的数量,go语言
  10. bzoj 1861 treap
  11. java spring 连接池配置_Spring中常用的连接池配置
  12. c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...
  13. 深度Linux操作系统使用体验
  14. python 汉字编码
  15. 透声投影幕布透声与画面效果可以媲美吗?
  16. 一起学英语 - 前言
  17. java语言排序函数_Java语言的8大排序
  18. 教你实现一个简单的对象深拷贝
  19. 负数在计算机中如何表示
  20. 干细胞膜包载鱼精蛋白/胰岛素/5-氟脲嘧啶/盐酸伐昔洛韦纳米药物(细胞膜纳米仿生物)

热门文章

  1. LuoguP4606 [SDOI2018]战略游戏
  2. 2020 ICPC NAC
  3. BZOj #4771. 七彩树(主席树+dfn序+lca)
  4. 不止代码:友好城市(动态规划)
  5. P4929-[模板]舞蹈链(DLX)
  6. AT4513-[AGC030D]InversionSum【dp】
  7. P2710-数列【Splay】
  8. jzoj1478-堆排序【堆】
  9. codeforces280 C. Game on Tree(期望)
  10. 【dfs】简单游戏(jzoj 2121)