手记

【备战春招】第5天 JAVA-Reflect专题

课程名称: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);//绕过编译操作就绕过了泛型


课程收获:

本节课程加深了反射、泛型与编译过程的关系,期待后续继续学习反射的一些实际使用场景案例。


0人推荐
随时随地看视频
慕课网APP