首页 > 编程语言 > 详细

Java基础之反射

时间:2019-10-23 16:24:39      阅读:98      评论:0      收藏:0      [点我收藏+]

Junit单元测试

       测试分类:

  1. 黑盒测试:不需要写代码,给输入值,看流程是否能够输出期望值
  2. 白盒测试:需要写代码,关注程序具体的执行流程

a)       定义一个测试类

                              i.           测试类名:被测试的类名Test                 FunctionTest

                            ii.           包名:xxx.xxx.xx.test                                cn.ycl.test

b)      定义一个测试方法:可以独来运行

                              i.           方法名:test测试的方法名                      testAdd()

                            ii.           返回值:void

                           iii.           参数列表:空参

c)       给方法加@Test

d)      导入junit依赖环境

判定结果:

a)       红色:失败

b)      绿色:成功

c)       一般使用断言操作来处理结果:Assert.assertEquals(期望值,实际值);

补充:

a)       @before:修饰的方法会在测试方法之前自动被执行

b)      @After:修饰的方法会在测试方法之后自动被执行

 

反射:框架设计的灵魂

       框架:半成品软件,可以在框架的基础上进行软件开发,简化编码

       反射:将类的各个组成部分封装为其他对象,这就是反射

              好处:

    1. 可以在程序运行过程中,操作这些对象
    2. 可以解耦,提高程序的可扩展性

获取class对象的方式:

1.Class.forName(“全类名”):将字节码文件加载进内存,返回class对象

*多用于配置文件,将类名定义在配置文件,读取文件,加载类

2.类名.class.:通过类名的属性class获取

*多用于参数的传递

3.对象.getClass():getClass()方法在Object类中定义着

*多用于对象的获取字节码的方式

结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取的class对象都是同一个

 

       Class对象功能:

              获取功能:

1.获取成员变量们

a)Field[ ] getFields():获取所有public修饰的成员变量

b)Field getField(String name)

c)Field[ ] getDeclaredFields( ):获取所有的成员变量

                       i.访问私有变量时,要忽略访问权限修饰符的安全检查

                       ii.  暴力反射:*.setAccessible(true);

d)Field getDeclaredField(String name)

Field操作:

                            i.设置值: void set(Object obj, Object value)

                            ii.获取值:get(Object obj)

2.获取构造方法们

a)Constructor<?>[ ] getConstructors( )

b)Constructor<T> getConstructor(类<?>…parameterTypes)

c)Constructor<?>[ ] getDeclaredConstructors( )

d)Constructor<T> getDeclaredConstructor(类<?>…parameterTypes)

Constructor构造方法:T getDeclaredConstructor().newInstance()

3.获取成员方法们

a)Method[ ] getMethods( )

b)Method  getMethod(String name,类<?>…parameterTypes )

c)Method[ ] getDeclaredMethods( )

d)Method  getDeclaredMethod(String name,类<?>…parameterTypes )

Method方法对象:

技术分享图片

 

 

4.获取类名

    a)String getName( )

技术分享图片

 

 

案例:

       需求:写一个“框架”,可以帮外面创建任意类对象

代码:

 1 package Reflect;
 2 
 3 import java.io.InputStream;
 4 import java.lang.reflect.Method;
 5 import java.util.Properties;
 6 
 7 public class ReflectTest {
 8     public static void main(String[] args) throws Exception {
 9         /*
10         *   可以创建任意类的对象,可以执行任意方法
11         *   前提:不能改变该类的任何代码,可以创建任意类的对象,可以执行任意方法
12         * */
13         //1.创建Properties对象
14         Properties pro = new Properties();
15         //2.加载配置文件,转换为一个集合
16         //3.获取class目录下的配置文件
17         ClassLoader classLoader = ReflectTest.class.getClassLoader();
18         InputStream is = classLoader.getResourceAsStream("pro.properties");
19         pro.load(is);
20         //4.获取配置文件中定义的数据
21         String className = pro.getProperty("className");
22         String methodName = pro.getProperty("methodName");
23         //5.加载该类进内存
24         Class cls = Class.forName(className);
25         //6.创建对象
26         Object obj = cls.getDeclaredConstructor().newInstance();
27         //7.获取方法对象
28         Method method = cls.getMethod(methodName);
29         //执行方法
30         method.invoke(obj);
31 
32     }
33 }
34 class Person{
35     private String name = "ycl";
36     private int age = 21;
37 
38     public void info(){
39         System.out.println("info...");
40     }
41 
42     public Person() {
43     }
44 
45     public Person(String name, int age) {
46         this.name = name;
47         this.age = age;
48     }
49 
50     public String getName() {
51         return name;
52     }
53 
54     public void setName(String name) {
55         this.name = name;
56     }
57 
58     public int getAge() {
59         return age;
60     }
61 
62     public void setAge(int age) {
63         this.age = age;
64     }
65 }
66 class Student extends Person{
67     public Student(){
68     }
69     public Student(String name, int age) {
70         super(name, age);
71     }
72     public void study(){
73         System.out.println("study....");
74     }
75 }
76 
77 //pro.properties文件
78 className =Reflect.Person
79 methodName = info

异常;

Exception in thread "main" java.lang.NoSuchMethodException: Reflect.Person.<init>()

       at java.base/java.lang.Class.getConstructor0(Class.java:3350)

       at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2554)

       at Reflect.ReflectTest.main(ReflectTest.java:26)

 

原因:缺少无参构造方法

Java基础之反射

原文:https://www.cnblogs.com/LIAN8/p/11725940.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!