Java范型深入理解,利用反射穿透编译器忽略范型

Java中的范型的作用阶段是在 编译时,也就是说范型是给编译器看的    。

我们经常看到  类 ArrayList<E>      后面的<E>  就是类型化参数,说明这个 ArrayList支持  范型化   。

比如   ArrayList<Integer>    就叫做Integer类型化的ArrayList.,当编译完之后 在运行阶段 就会丢掉 类型化参数   。 

 

范型化后的 类型  与原始类型之间的操作: 

Collection c=new Vector<Integer>() ;          可以 

 

Collection<Integer> c=new Vector() ;  //也可以   

 

 

Vector<Integer>  ccc=new Vector<Object>();     //错误 因为 前后类型不匹配     Object'课代表任意类型

 

  Vector<Integer>[]  cccc=new Vector<Object>[10]();    //数组不能进行范型化 ,因为每个Vector本身就像当一个数组 每个数组都有自己的类型
  

  Vector  v=new Vector<String>() ;   
  Vector<Object> v1=v ;       //虽说前后类型不匹配但是也可以  因为编译器进行语法检查是一行行的往下走的    走到第二部的时候 v 就是原始没有 范型化的Vector对象  

 

 

利用反射穿透编译器 忽略范型:

ArrayList<Integer>  col1=new ArrayList() ; 
  col1.getClass().getMethod("add",Object.class).invoke(col1, "reflect") ;   //这个运行时候才会调用 于是就跳过了编译器
  System.out.println(col1.get(0));
  

 

 

 

  

时间: 2024-10-27 06:28:58

Java范型深入理解,利用反射穿透编译器忽略范型的相关文章

聊聊我对Java内存模型的理解

所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编译器和微架构两部分.我试图了解了Java.C#和Go语言的内存模型,发现内容基本大同小异,只是这些语言在具体实现的时候略有不同. 我们来看看Java内存模型吧,提到Java内存模型大家对这个图一定非常熟悉: 这张图告诉我们在线程运行的时候有一个内存专用的一小块内存,当Java程序会将变量同步到线程所在的内存,这时候会操作工作内存中的变量,而线程中变量的值何时同步回主内存是不可预期的.但同时Java内存模型又告

数组类型转换-JAVA如何利用反射指定類型

问题描述 JAVA如何利用反射指定類型 自己写一个工具类,求大神帮忙看下能否利用反射或者泛型实现类型转换. public static Object[] getArray(Class cString str){ List list=jdbcUtil.getList(c str);//list是利用反射生成的List return list.toArray(new Object[list.size()]);//可否根据传入的Class指定Array类型 } 因為:Object[] objs=new

反射 注解-Java利用反射执行框架注入类的非静态方法

问题描述 Java利用反射执行框架注入类的非静态方法 之前对代码做优化,利用了反射去执行指定类的指定方法: public static JsonResultVO callMethod(Class<?> className String methodName Class<?>[] paramClass Object[] param) { JsonResultVO resultVO = new JsonResultVO(); try { Method m = className.get

Java利用反射自动封装成实体对象的方法_java

本文实例讲述了Java利用反射自动封装成实体对象的方法.分享给大家供大家参考.具体分析如下: 利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 复制代码 代码如下: //获取页面数据,自动封装成bean对象 public List getObjectList(Class clazz,String[] rowNos) throws Exception{         List objList

Java基础之010-深入理解Java的String类

Java基础之010-深入理解Java的String类                                        老帅        1. 首先String不属于8种基本数据类型,String是一个类.  因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性.  2. new String()和new String("")都是申明一个新的空字符串,是空串不是null:  3. String对象实例化   

java中利用反射调用另一类的private方法的简单实例_java

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:  import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo

Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据

  package me.test; import java.lang.reflect.*;  //导入反射需要的包 public class ReflectTest {  public static void main(String[] args)  throws  Exception  {       /*  下面通过反射完成对一个对象中成员的替换    *   并且执行执行私有方法     *   完成对 Poiont类的对象中所有的 String的对象的d换成x    *   并且类中无

利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""

(C#)利用反射动态调用类成员

动态 (C#)利用反射动态调用类成员 使用反射动态调用类成员,需要Type类的一个方法:InvokeMember.对该方法的声明如下(摘抄于MSDN): public object InvokeMember( string name, BindingFlags invokeAttr, Binder binder, object target, object[] args ); 参数 name String,它包含要调用的构造函数.方法.属性或字段成员的名称. - 或 - 空字符串 (""