new 创建对象,是在编译时静态加载类,需要加载所有可能用到的类
123
反射
。。。
动态加载方式
成员变量也是对象
java.lang.reflect.Field
Field类封装了关于成员变量的操作
getFields()方法获取的是所有的public的成员变量的信息
getDeclaredFields() 获取的该类自己声明的成员变量的信息
构造函数也是对象
java.lang.Constructor中封装了构造函数的信息
要获取类的信息,首先要获取类的类类型 传递的是哪个子类的对象,获取的就是该子类的类类型 Class c = obj.getClass(); 获取类的名称 c.getName(); 获取方法 Method类时方法对象 一个成员方法就是一个Method对象 getMethods()方法获取的是所有的public的函数,包括父类集成而来的 getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
getReturnType() 得到方法的返回值类型的类类型
getParameterTypes() 得到参数列表的类型的类类型
Class.forName(类的全称) 代表了动态加载类
编译时刻加载类时静态加载类
运行时刻加载类是动态加载类
new创建对象是静态加载类,在编译时刻就需要加载所有可能使用的类
动态加载类,在运行时加载,再通过类类型创建类型对象
可以通过类的类类型创建该类的对象实例,需要有无参数的构造方法
类名 对象 = c1.newInstance();
任何一个类都是Class的实例对象,这个实例对象有三种表达方式
第一种,
Class c1 = 类名.class;
第二种 该类的对象通过getClass()方法获得
Class c2 = 对象.getClass();
c1 c2表示了类的类类型,不管c1 c2都代表了父类的类类型,一个类只可能是Class类的一个实例对象
第三种
Class c3 = null;
c3 = Class.forName(类的全路径);
double.class 不同于Double.class
double是个类型 Double是类
绕过编译器对泛型list添加泛型规定外的类型元素.
泛型只在 编译阶段 有效.
函数参数列表的类类型.
getParameterTypes
getMethods获取不到 继承而来的 方法.
double.class 和 Double.class 完全不同.
这里实现了不需要再次编译.
也就实现了所谓的"动态".
这里太经典了. 是"接口"使用的具体场景. 也就是"提取公共/抽象的部分".
这里是"运行时报错"的实例(也就是控制台报错).
但是编译时不报错.
当然 报错的原因是找不到forName里的的参数所指向的"类"
这里用Class.forName方法实现"动态加载类".
这里注意"需要有无参数的构造方法".
Class xx xx就是类类型(class type)