课程名称:JAVA反射
课程章节:1-4 获取成员变量信息
课程讲师: Cedar
课程内容:
一、获取成员变量信息
1、成员变量
成员变量也是对象
java.lang.relect.Field
Field类封装了关于成员变量的操作
getFields()方法获取的是所有的public的成员变量的信息
getDeclaredFields获取的是该类自己声明的成员变量的信息
Field[] fs = c.getDeclaredFields();
for(Field field:fs){
Class fieldType = field.getType();
String typeName = fieldType.getName(); //成员变量的类型的类类型
String fieldName = field.getName(); //成员变量的名称
}
2、构造函数
构造函数也是对象
java.lang.Constructor中封装了构造函数的信息
getConstructors()获取所有的public的构造函数
getDeclaredConstructors得到所有的构造函数
Constructor[] cs = c.getDeclaredConstructors();
for(Constructor constructor:cs){
String constructorName = constructor.getName();
Class[] paramType = constructor.getParameterTypes();
for(Class class1:paramType){
String paramTypeName = class1.getName();
}
}
二、方法的反射
1、概述
方法的名称和方法的参数列表唯一决定某个方法
方法反射的操作:method.invode(对象,参数列表)
2、获取类的信息、获取类的类类型,根据方法名称和参数列表获取方法
A a1 = new A();
Class c = a1.getClass();
Method m = c.getMethod("print",new Class[]{int.class,int.class});//获取的是public的方法
Method m = c.getDeclaredMethod("print",new Class[]{int.class,int.class});//获取的是自己声明的方法
3、方法的反射
//用方法对象来进行方法调用
//方法如果没有返回值返回null,有返回值返回具体的返回值
m.invoke(a1,new Object[]{10,20});
m.invoke(a1,10,20);
三、集合泛型
Java中集合的泛型是防止错误输入的,只在编译阶段有效果
编译之后集合的泛型是去泛型化的
ArrayList<String> list1 = new ArrayList<String>();
list1.add("hello");
Class c2 = list.getClass();
Method m = c2.getMethod("add",Object.class);
m.invoke(list1,20);//绕过编译操作就绕过了泛型
课程收获:
本节课程加深了反射、泛型与编译过程的关系,期待后续继续学习反射的一些实际使用场景案例。