Java基础——反射

Junit单元测试

测试分类:
	黑盒测试:不需要写代码,给输入值,看流程是否能够输出期望值
	白盒测试:需要写代码,关注程序具体的执行流程
		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:修饰的方***在测试方法之后自动被执行

反射:框架设计的灵魂

   框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
   反射:将类的各个组成部分封装为其他对象,这就是反射
   好处:
	可以在程序运行过程中,操作这些对象
	可以解耦,提高程序的可扩展性
	获取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)

原因:缺少无参构造方法

全部评论

相关推荐

2025-12-17 11:39
门头沟学院 测试开发
bg:双非本,一段中小厂6个月测开实习今天发这个帖子主要是想聊一聊我秋招以来的一个发展我是在8月底辞职,打算秋招,可是看网上都说金九银十就想着自己就是一个普通本科生,现在九月份都是一些大神在争抢,所以9月份基本上没投,等到了10月份才开始秋招,可是这个时间好像已经有些晚了,今年秋招开启的格外早,提前到了7,8月份,我十月才开始,官网投了很多公司,没有任何一个面试机会,这个情况一直到了十月底才有了第一个面试,当时没有面试经验,所以不出意外的挂了后续就是漫长的投递,但是毫无例外没有面试,没有办法我只能另辟蹊径开始在BOSS上边投递,然后顺便也根据BOSS上边这个公司名称去浏览器搜索看看有没有官网投递渠道,毕竟官网上投递后还是可以第一时间被HR看到的,然后一直不停投递,一开始第一个星期基本上都是投的正式秋招岗位到了第二个星期才开始实习和正式一起投,到十一月底的时候已经沟通了700➕才有一共1个正式的,5个要提前实习的,3个实习的面试,最后结果是过了1个要提前实习的和2个实习的每次面试我都会复盘,发现这些小公司面试官问的五花八门,有的专问基础,有的专问项目,有的啥都问,不过自己也是看出来了一下门道,就是小公司不像大公司面试官那样能力比较强基本上你简历上边的他都会,然后会根据简历来问,小公司面试官他们更多的是看自己会什么,然后看看你简历上边哪些他也是会的然后来问,经过不断的复盘加上背各种各样面试题,到了11月底12月初才有了1个要提前实习的offer还有2个实习的offer,而且薪资待遇对我来说已经很可观了可是啊,人总是这样得了千钱想万钱,我又开始不满现状,但是此时的我面试能力经过这么多面试和复盘已经很强了,然后在十二月份运气爆棚,被极兔和小鹏补录捞起来面试,还有个百度测开的实习面试,这个时候因为有了offer所以感觉有了底气,面试也很自信,最后结果是全部都过了那个时候我感觉自己真的很厉害,我问了极兔那边的HR像我这样的双非本收到offer的在极兔有多少?他告诉我产研岗90%都是硕士,10%里边基本上都是211,985,想我这样的很少很少,那一刻感觉自己超级牛逼,小鹏就更不用说了,最后也是不出意外选择了小鹏所以我就我个人经历想对和我学历履历差不多的牛友一些建议第一:秋招一定要趁早,真到了9,10月,那个时候可能你投的结果可能还不如7,8,11月,第二:最好先拿小公司实习或者正式练练手,提升一下面试能力,我个人觉得因为小公司问的五花八门所以你会更加横向去提升自己能力,而且大公司其实面试没有那么难,除了一些非常卷的岗位,公司大神比较多会问的很难,一般好点的公司都不会问的那么难,他们也知道都是应届生不会要求那么高第三:当有一定能力后,就是坚持了,对于我们这样的学历,没有特别强的履历情况下,就是要抓住提前批和补录的机会,这个时候各方面不会卡的很严,是我们很好很好的一个机会第四:就是运气也是很重要的一部分,不过这个很难去说什么最后祝各位牛友都能收获自己满意的offer😁😁😁
秋招,不懂就问
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务