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. 案例:来自Uber的Go语言GC优化实践
  2. Scala教程之:Either
  3. python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...
  4. android 字体竖直居中_问下弹性盒内不知道高度的时候想让字体垂直居中代码要怎么写...
  5. 在Java里怎将字节数转换为我们可以读懂的格式?
  6. 增加数据_咱晋城人口又增加了?最新数据来了
  7. 面向对象-多态,反射
  8. 大数据可视化html模板开源_大数据时代-可视化数据分析平台必不可少
  9. linux查看目录下 开头,Linux下ls如何看到.开头的文件
  10. RabbitMQ实现RPC
  11. 吃鱼还是吃肉 (10 分)
  12. Java Class的文件结构
  13. 东北大学软件项目管理与过程改进题库——首字母排序
  14. Ensembl数据库简介
  15. uniapp小程序根据经纬度精确定位
  16. 操作系统——进程管理思维导图(一)
  17. 基于N-gram的双向最大匹配中文分词
  18. 软件设计师证书的作用有多大?
  19. STM32F103超声波HCSR04模块串口输出距离(附代码)
  20. 浅谈单片机低功耗处理

热门文章

  1. 踩不出足迹(牛客练习赛88 )
  2. P2664 树上游戏
  3. [luogu-P4299] 首都(并查集 + LCT动态维护树的重心 / 维护虚儿子信息)
  4. CF204E-Little Elephant and Strings【广义SAM,线段树合并】
  5. P3329-[ZJOI2011]最小割【最小割树】
  6. ssl初一组周六模拟赛【2018.3.17】
  7. 【树链剖分】洛谷树(P3401)
  8. 【期望】乘坐电梯(金牌导航 期望-2)
  9. 面试官:为什么 Spring Boot 的 jar 可以直接运行
  10. Spring JSR-250 注释