Java之Junit和反射

发表于:2018-10-10 15:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:我想回家    来源:博客园

分享:
  import java.lang.reflect.Constructor;
  /**
  * @author
  * @date 2018/7/31
  * @描述 利用反射获取对象的构造方法
  */
  public class GetConstructDemo {
  public static void main(String[] args) throws Exception {
  // 利用反射获取公有成员变量的步骤
  // 1. 获取反射对象(3种方法)
  Class aClass = Student.class;
  // 2. 使用方法获取构造方法的对象
  Constructor constructor = aClass.getConstructor(String.class, int.class, String.class);
  // 3. 使用Constructor对象初始化对象
  Object obj = constructor.newInstance("张三", 23, "男");
  // 测试输出结果
  System.out.println(obj);
  System.out.println("===================================");
  // 无参构造的方法
  // 1. 获取反射对象(3种方法)
  Class aClass1 = Student.class;
  // 2. 使用方法获取构造方法的对象
  Constructor constructor1 = aClass1.getConstructor();
  // 3. 使用Constructor初始化对象
  Object obj1 = constructor1.newInstance();
  // 测试输出结果
  System.out.println(obj1);
  // 还有个简化写法,仅仅适用于无参构造,但是我使用JDK10已经不推荐使用了
  Object obj2 = aClass1.newInstance();
  System.out.println(obj2);
  // getDeclaredConstructor方法也是获取私有的构造方法,就不演示了
  }
  }
  Method:方法对象
  执行方法:
  Object invoke(Object obj, Object... args)
  获取方法名称:
  String getName:获取方法名
  首先在Student中添加两个方法
  public void eat(){
  System.out.println("eat..............");
  }
  public int add(int a, int b){
  return a + b;
  }
  package com.wzlove.reflect;
  import java.lang.reflect.Method;
  /**
  * @author 王智
  * @date 2018/7/31
  * @描述 反射执行方法
  */
  public class GetMethodDemo {
  public static void main(String[] args) throws Exception {
  // 无参无返回值的方法
  // 1. 创建字节码对象
  Class aClass = Student.class;
  // 2. 创建方法的对象
  Method eat = aClass.getMethod("eat");
  // 3. 执行方法
  Student stu = new Student();
  eat.invoke(stu);
  // 有参有返回值的方法
  // 1. 创建字节码对象
  Class aClass1 = Student.class;
  // 2. 创建方法的对象
  Method add = aClass1.getMethod("add", int.class,int.class);
  // 3. 执行方法
  Student stu1 = new Student();
  Object sum = add.invoke(stu1, 10, 10);
  System.out.println("和为" + sum);
  System.out.println("======================================================");
  // 获取该类所有的方法(这里获取的不仅仅是自己定义的方法,还有从父类继承来的方法)
  Method[] methods = aClass1.getMethods();
  for (Method method : methods) {
  System.out.println(method);
  System.out.println(method.getName());
  }
  System.out.println("======================================================");
  // 获取类名
  System.out.println(aClass1.getName());
  // getDeclaredMethod也是同样的道理
  }
  }
  以上就是反射的简单使用了.举个简单例子,当然这个例子并不完善,将就看
  package com.wzlove.reflect;
  import java.io.IOException;
  import java.io.InputStream;
  import java.lang.reflect.Constructor;
  import java.lang.reflect.Method;
  import java.util.Properties;
  /**
  * @author
  * @date 2018/7/31
  * @描述
  * * 案例:
  *  * 需求:写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,
  *  并且执行其中任意方法
  *      * 实现:
  *          1. 配置文件
  *          2. 反射
  *      * 步骤:
  *          1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
  *          2. 在程序中加载读取配置文件
  *          3. 使用反射技术来加载类文件进内存
  *          4. 创建对象
  *          5. 执行方法
  */
  public class ReflectDemo {
  public static void main(String[] args) throws Exception {
  // 创建本类的字节码对象
  Class aClass = ReflectDemo.class;
  // 获取类加载器对象
  ClassLoader classLoader = aClass.getClassLoader();
  // 加载配置文件,返回字节流对象
  InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
  // 读取配置文件
  // 创建Properties对象
  Properties properties = new Properties();
  properties.load(resourceAsStream);
  // 反射的使用
  Object className = properties.getProperty("className");
  Object methodName = properties.getProperty("methodName");
  // 使用反射创建对象
  Class aClass1 = Class.forName((String) className);
  Constructor constructor = aClass1.getConstructor();
  Object obj = constructor.newInstance();
  // 利用反射获取方法
  Method method = aClass1.getMethod((String) methodName);
  // 使用反射执行方法
  method.invoke(obj);
  }
  }


   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
价值398元的测试课程免费赠送,填问卷领取吧!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海漕溪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2022
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号