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

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

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

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

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

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

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

Class class = ${Class}.class;

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

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

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

 正确的写法如下

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

Class对象的Api:

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/linyueshaoxia/p/13997626.html