Reflection - juedaiyuer/researchNote GitHub Wiki
#反射#
##Class类##
类是对象,类是java.lang.Class类的实例对象
类类型获取方法
- 类名.class
- 类的一个实例.getclass
- class.forname("类所在的位置(包名.类名)")
通过类类型可以实例化该类的一个实例
##动态加载类##
Class.forName("类全称");
- 不仅表示类类型,还表示了动态加载类
- 编译时刻加载的类是静态加载类
- 运行时刻加载的类是动态加载类
new创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类
功能型的类应该使用动态加载类
package reflect;
public class office {
public static void main(String[] args) {
// TODO Auto-generated method stub
if("Word".equals(args[0]))
{
Word w = new Word();
w.start();
}
if("Excel".equals(args[0]))
{
Excel e = new Excel();
e.start();
}
}
}
- 单独编译该文件的时候,很多的err;没有类Word,Excel及其定义的start方法
- 通过前面的描述,程序使用了静态加载的模式,需要加载所有用到的类
基本的数据类型也有数据类型
简单方法getName,获取类名称;getSimpleName,获取不包含包名的类名称.
Class类的基本API
获取方法信息
获取成员变量信息,java.lang.reflect.Field,Field类封装了关于成员变量的操作;getFields()方法获取的是所有public成员变量信息
方法的反射
Class,Method去了解泛型的本质.编译之后集合的泛型是去泛型化的
java中集合的泛型,是防止错误输入的,只在编译阶段有效
通过反射,绕过编译操作