//来自一道面试题的分析,大概的意思是,如果让你在集合中增加不同类型的数据,你会怎么做?
package cn.cnsy123.ypf.thread.test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class Demo1 {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, ObjectTOIntegrException {
ArrayList list = new ArrayList();
list.add(123);
Class> clz = list.getClass();
Method method = clz.getMethod("add", Object.class);
method.invoke(list, "qwe");
method.invoke(list, "haha");
System.out.println(list);
}
}
解释,初始创建一个空的list集合,暂时将泛型定义为Integer整形数据类型,
ArrayList
在java7的新特性中,可以这么定义
ArrayList
并增加几个符合泛型的数据,比如:
list.add(111);
list.add(222);
list.add(333);
list.add(444);
然后,怎么解决增加其他数据类型的数据呢?
一般会直接这么做:
list.add("hello world");
可以这样会发现编辑器,会给我们这样的提示
就是说这个方法不能将String类型的数据作为参数增加进List集合中,
那我们怎么办呢?
这时,我们可以想一想class文件中的编码格式是怎么样的
我们会发现在编译成class文件时泛型,被javaJVM剔除了,也就是说在编写java代码时有泛型
而在编译成class文件时,泛型被去除了,
那么我们所知道的什么可以直接在编写过程中就可以实现这种方式呢?
当然是java反射了,我们可以想想怎么做呢?
首先,先得到list集合的class对象,也就是获取ArrayList类的class对象,
Class> clz = list.getClass();
当然也可以是这样的:
Class
然后再获取list集合的add方法,
Method method = clz.getMethod("add", Object.class);
这里有两个参数,第一个是要获取的方法的名称;第二个是要获取的方法的方法参数类型,
这里的方法参数类型,我们就可以用来做点文章了,
如果我们只想有Integer类型的数据,那么就是Integer的class对象,也就是Integer.class;
Method method = clz.getMethod("add", Integer.class);
如果我们只想是其他类型的数据,那么就是其他类型的class对象;
Method method = clz.getMethod("add", String.class);
Method method = clz.getMethod("add", Boolean.class);
......
......
这里我们要的是可以增加所有的类型,所以我们将之定义成Object超类的class对象即可;
第三步,使用Method方法的invoke方法去进行赋值,
method.invoke(list, "haha");
method.invoke(list, 'd');
method.invoke(list, true);
method.invoke(list, 1000000L);
.......
第四步,将我们的结果展示出来,也就是上面的三步,已经实现了我们想要的结果,所以
直接使用输出语句打印到控制台上即可。
System.out.println(list);
最终结果展示,
谢谢大家的阅览,有问题请在下方评论区留言,感谢大家的支持。