反射机制允许程序在运行时取得任何一个已知名称的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()来获取某个类对象的父类对象