java每日一学_【java每日一学】java的反射机制

反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,并可于运行时改变fields内容或调用methods。

Class(类对象)  ----java.lang.Class

可以通过三种方式获取一个类的类对象

1.已知一个对象实例(instance)想获取其类对象的情况

Class class = ${instance}.getClass();

41eb489d8e42cc9d11789eeef552ea11.png

2.已知类获取其类对象的情况

Class class = ${Class}.class;

db0d98c7075bb08cc9a74e4a7e26001f.png

3.已知类名获取其类对象的情况(可能抛出ClassNotFoundException)

Class class = Class.forName('${类名}');

用这种方法获取类对象需要使用类的全名,即"包名.类名",而且不能使用单引号.

f81395a7394393de2ee9066958594c9b.png

正确的写法如下

4d35537c04bf84d7cf20f57abbfd02ae.png

这三种方式获取的类对象如果是同一个类,equals方法的结果是true

Class对象的Api:

getName():获得类的完整名字。

bcdaa018c6491016e886b18f9d8a4c0a.png

getFields():获得类的public类型的属性。

37e113c29863bd1f855064efe8153a40.png

getDeclaredFields():获得类的所有属性。包括private 声明的和继承类

2a65efe5ae9506c33afeea09e43f52b5.png

getMethods():获得类的public类型的方法。

d1cb2066afb810c24b388c9f6920bbaa.png

getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类

9289c169eab5178a033d61f77bb185c8.png

getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。

6e567258c6f9f21af63e037bb2345d72.png

这里出现警告的原因是:Class本身是一个带有泛型的类,即原本的写法是Class>,当没有明确指定泛型的类型时,java无法根据泛型进行类型检查。

getConstructors():获得类的public类型的构造方法。

df22a4d0019e7a6dd016d97d6b110625.png

getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。

f7f2d621a365b333f5f40b25f61084e5.png

出现警告的原因跟上述getMethod一样,也是没有指定泛型所导致的。实际编码中可以使用@SuppressWarnings("unchecked")来压制未检查警告。

newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

5df21d68c676254ba350701fa86b26a8.png

这里出现了一个异常:Integer类型无法通过newInstance来构造实例,是不是因为其没有不带参数的构造方法呢,查阅api文档:

9b8ece83010412144bf50bd7eb20c9be.png

果然,如果一个类没有默认构造方法(无参构造方法),则会导致实例化失败。并抛出InstantiationException异常.

如果想带有参数的构造实例,则应该使用${constructor}.newInstance()方法,如下图,来自https://www.cnblogs.com/duanweishi/p/4480163.html

5b01dad2e4c59646d8811d84559edd28.png

上面方法中涉及的类型有:Field、Method、Constructor 都是java.lang.reflect包中的类。分别表示类的属性、类的方法、类的构造方法。

可以使用${class}.getSuperclass()来获取某个类对象的父类对象

054f59a8fb934ca47df08b2f9ed38220.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值