第十天Java基础增强(反射)

1. Junit(测试)

1.三个注解
@Before
@Test
@After
2.一个方法
Assert.assertEquals(7,add);

2. 反射

1.什么是反射
将字节码文件加载到内存中
2.反射的好处
在程序的运行过程中操作这些对象
解耦,提高程序的扩展性
3.获取class对象的三种方式
Class.forName(“全类名”)
常用于配置文件加载类
类名.class 通过类名的class的属性获取
常用于传递参数
对象.getClass() : 该方法在Object中定义
常用于对象获取字节码
4.同一个字节码文件在程序中,只会被加载一次

常用的方法

1.获取成员变量

Field[] getFields() : 获取所有的public修饰的成员变量
Field getField(String name) : 获取指定的
///
Field[] getDeclaredFields() : 获取所有的成员变量
Field getDeclaredField(String name) : 获取指定的
获取有访问权限的成员变量时,需要忽略权限修饰
f.setAccessible(true);
///获取完变量后需要对他进行操作需要有一个对象

Class aClass = Class.forName("demo04.Calculator");
Field a = aClass.getField("a");
Calculator calculator = new Calculator();//任何情况下操作都需要传递一个对象,才能对其中的变量、方法、构造方法进行操作
a.set(calculator,"张大爷");
Object o = a.get(calculator);

2.获取构造器,想要获取构造方法就必须获取构造器

Constructor<?>[] getConstructors() : 获取所有的构造器
Constructor< T >[] getConstructor(类<?>… paramenterTypes) :获取指定参数的构造器

Constructor< T > getDeclaredConstructor(类<?>… paramenterTypes)
Constructor<?>[] getDeclaredConstructors() :所有包括私有的

通过构造器获取构造方法
Constructor constructor = aClass.getConstructor(String.class, int.class);
Object o = constructor.newInstance(“String参数”,int参数) 无参数为空参构造方法

获取空参构造方法的简单方式
Class类中的newInstance()方法
aClass.newInstance();

使用getDeclaredConstructor时也要忽略权限检测
constructor .setAccessible(true);

Class aClass = Class.forName("demo04.Calculator");
Constructor constructor = aClass.getConstructor(String.class, int.class);
Object cons = constructor.newInstance("你好", 19);

3.获取普通方法

Method[] getMethods() 获取所有
Method getMethod(String name,类<?>…) 获取指定名称,参数的方法

Method[] getDeclaredMethods()
Method[] getDeclaredMethod(String name,类<?>…)
method.getName() 获取方法名

Class<Calculator> aClass = Calculator.class;
Method method = aClass.getMethod("getName");//获取有参方法,需要加上参数列表
method.invoke(new Calculator());
/*
Method method = aClass.getMethod("getName",String.class);
method.invoke(new Calculator(),"你好");
*/

4.案例

从配置文件中读取类信息和方法信息,调用该类的方法

 //1.加载配置文件
        Properties pro = new Properties();//使用Properties集合获取配置文件信息
        ClassLoader classLoader = demo05.class.getClassLoader();//找到本类.class文件夹
        InputStream is = classLoader.getResourceAsStream("pro.properties");//找到.class下面的配置文件,并读取为流
        pro.load(is);//将流写入到集合中
        String className = pro.getProperty("className");//在集合中找到指定元素
        String method = pro.getProperty("methods");
        //2.有了类与方法
        Class aClass = Class.forName(className);//加载类文件
        Object o = aClass.newInstance();//调用空参构造方法去创建对象
        Method method1 = aClass.getMethod(method);//获取需要被执行的方法
        method1.invoke(o);//调用方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值