JAVA_Reflect
1.Class类
(1)java中,静态成员和普通数据类型不是对象;
(2)类是java.lang.Class类的对象;
(3)表示方法
a.Class c1 = class_name.class;
b.Class c2 = object_name.getClass();
//某个类的class type
c.Class c3 = Class.forName("类路径");
(4)通过类的Class Type创建该类的对象
(Class_Name)c1.newInstance();
//该类需要有默认无参构造方法
2.动态加载类
(1)静态加载: new创建对象时,是静态加载,即编译时加载
(2)动态加载: 运行时加载 Class c = Class.forName(args[0])
(3)功能性类一般使用动态加载
3.获取方法信息
(1)关键字的类类型:
int.class;
String.class;
double.class;
...
void.class;
(2) 类类型的常用方法:
a.c1.getName();
b.c1.getMethods();//返回的是Method类型集合,所有public方法,包括继承的
c.c1.getDeclaredMethods()//获取该类自己声明的方法
(3)Method类型的方法:
a.m1.getReturnType();//得到的是类类型
b.m1.getName();
c.m1.getParameterType();
4.获取成员变量信息
(1)成员变量也是对象:
成员变量是java.lanng.reflect.Field类的对象
a.c1.getDeclaredFileds();
b.f.getType();
c.f.getName();
(2)构造方法也是对象:
构造方法是java.lang.Constructor类的对象
a.c1.getConstructors();
b.con1.getName();
c.con1.getParameterTypes();
5.方法的反射操作
Method m = c.getMethod(parma1,param2);
m.invoke(object, param1.param2,...);
6.泛型的本质
//反射的操作都是编译后的操作,是字节码, 运行时操作;
//编译之后,集合的泛型是去泛型化的;
//泛型是编译时防止误操作的,编译后就无效了
//可以通过反射操作绕过编译来使泛型无效