利用反射调用方法,以及绕过泛型检查
2017-07-29 11:20
260 查看
比如知道一个类的对象,我们知道方法的名称,但是只有在运行的时候才知道调用哪个方法,这样只能用反射的方式调用了,拿List举例
List list = new ArrayList();
但是我们只有在实际运行的时候材质到时调用他的add方法,过程如下:
1、取得该类的Class对象:所有反射,在使用之前都必须拿到该类的Class对象(方法有三种,不一 一介绍):
Class c = list.getClass();
2、根据该类的Class对象获得add方法的Method对象:
Method m = c.getMethod("add",Object.class);//参数说明:方法名称、方法参数岁数类的类类型
3、调用方法添加对象到集合
m.invoke(list , 20);//第一个参数是类的对象,第二个参数代表加入集合的元素
4、查看集合的长度
System.out.println(list.size());//这就添加成功了
补充:这种方法添加元素会绕过泛型的检查,因为泛型的检查是在编译阶段进行的,而反射的使用都是跳过编译的,没有编译阶段,直接使用编译后的字节码文件
比如,定义集合对象的时候使用ArrayList <String> list = new ArrayList<String>();
结果一样,最后int 型的20 还是会添加进list,而且不报错,因为他没有进行编译检查阶段,所以不会进行泛型的检查。
List list = new ArrayList();
但是我们只有在实际运行的时候材质到时调用他的add方法,过程如下:
1、取得该类的Class对象:所有反射,在使用之前都必须拿到该类的Class对象(方法有三种,不一 一介绍):
Class c = list.getClass();
2、根据该类的Class对象获得add方法的Method对象:
Method m = c.getMethod("add",Object.class);//参数说明:方法名称、方法参数岁数类的类类型
3、调用方法添加对象到集合
m.invoke(list , 20);//第一个参数是类的对象,第二个参数代表加入集合的元素
4、查看集合的长度
System.out.println(list.size());//这就添加成功了
补充:这种方法添加元素会绕过泛型的检查,因为泛型的检查是在编译阶段进行的,而反射的使用都是跳过编译的,没有编译阶段,直接使用编译后的字节码文件
比如,定义集合对象的时候使用ArrayList <String> list = new ArrayList<String>();
结果一样,最后int 型的20 还是会添加进list,而且不报错,因为他没有进行编译检查阶段,所以不会进行泛型的检查。
相关文章推荐
- 不通过反射在其它类中直接调用access$000方法,即:如何绕过这个检查
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- Unity C# 使用反射,利用字符串作为泛型参数调用泛型方法。
- Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据
- 不通过反射在其它类中直接调用access$000方法,即:如何绕过这个检查
- 在工厂模式里面利用反射机制动态调用对象方法
- 利用反射机制,读取dll,并调用其中的方法
- java中利用反射调用另一类的private方法
- 利用.net反射动态调用指定程序集的中的方法
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- C# aspx页面动态加载ascx用户控件 及 利用反射调用其内方法
- 利用反射对私有属性/方法进行设置/调用(转自己贴)
- 简单的“反射调用泛型方法”
- C#反射新建类实例和调用类方法及属性帮助类 以及获取或设置对象属性中字段值帮助类
- java反射获取方法以及调用方法
- 将DLL放在资源文件中,利用反射来调用它的泛型函数!
- 利用反射,泛型,静态方法快速获取表单值到Model。
- 利用反射,泛型,静态方法快速获取表单值到Model。(转)
- Android 反射调用方法并利用此方法展开android通知栏(兼容4.2及以上)