一道反射和泛型的面试题

              面试题目大概如下:

                            现在有Class A 有三个成员 a,b,c.及其get,set方法。。。。

                            再有一泛型类 Class Test  里面有一方法public T buildClass(Map map);

                            map传入的参数是class A 成员的实例数据{a=>1,b=>2,c=>3}

                            问能否通过 buildClass方法进行实例话A,即A=new Test<A>().buildClass(map);

 

             一开始我完全没有思路,心想,buildClass完全没提供类的信息给我,我怎么去实例化A类.

            后来面试官见我茫然,提供下思路:泛型是在编译的时定就确定类型,反射的调用是在运行时。

   并提供可以先找到buildClass的返回类型再实例化。当我高兴的顺着这个思路下去的时候,面试官

   来了句,实际并不可行。。然后就略过了这面试题了。。

          

           回到家,对这个理论和实际冲突的现象,百思不得其解。。肯定哪个环节出现了问题。然后动手自己分析。

    一开始我先否定了结论,buildClass是可以实现的。经过我百度,用T extends abc (abc是抽象类),都无法实现.

          然后在一次的调试中   System.out.println(this.getClass().getDeclaredMethods()[1]);

          出现结果是:public java.lang.Object ddddd.Test.buildClass(java.util.Map)

          因此有个大胆的猜想:泛型是在编译的时定就确定类型,这句话中的类型,起了疑心,这个确定的类型并不是运行时

   new Test().buildClass(new HashMap());的abc类型,而是Test,T所能确定的第一个父类,例Test

         T就在编译时会被编译成Test,如果 Test,则是Test

        

        带着这个问题去用javap -verbose 反编译下Class文件. 

       

 

        再看看 T extend abc

      

   

     

        所以结论:public T buildClass(Map map); 我们是无法获取到类型参数的。迷雾已解开。。。

  

 

 

你可能感兴趣的:(JAVA,泛型,反射)