Class<?> cls = Class.forName("com.code.Test"); 这个?怎么具体化,因为Test类是运行时动态加载的,所以我想不到办法让泛型具体化. 不具体化也不影响我的使用,只是我想看看有没有什么方法可以具体化。

解决方案 »

  1.   

    Test类的代码,在系统中没有,在运行的时候动态读取Class文件加载进虚拟机的。
      

  2.   

    Class cls = Test.class;//得到当前类对应的Class
    Test test = (Test)cls.forName();//此方法返回值为Object,可向下转型为Test对象
      

  3.   

    第一:Class <?> cls = Class.forName("com.code.Test"); 可能没明白我的意思,我要的是把?具体化,就像Map<?,?> 需要具体化为Map<String,String>一样。
    第二:针对你说的,Test类在系统中没有,你怎么转?
      

  4.   

    cls.newInstance().getClass();是那个的真正的类型,不是太明白楼主的意思。
      

  5.   

    LZ的意思是将?替换成具体的class类型,这个明显不可能具体到test啊,既然你说是运行时动态装载的Test,那编译的时候恐怕还不知道Test吧;怎么可能具体?顶多就只能指定到它的super class,如果还不知道,就一直上溯到Object吧,呵呵
      

  6.   


    // 如果要类的实例Object instance = cls.newInstance();
    Test test = (Test)instance;// ....
      

  7.   


    如果编译期 com.code.Test 类不存在要在代码中直接把 cls 用作 Class<com.code.Test>, 应该不行的吧
      

  8.   

    你说的非常正确,如果这样可以的话,我就不用在这里问了。com.code.Test 类,我在系统运行起来后才设计的,而且可以随意设计很多。这才是动态加载。
      

  9.   

    cls.newInstance().getClass() 跟Class.forName("com.code.Test") 返回的类型没有区别,不过这跟我说的问题无关。
      

  10.   

    不用头疼了,完全不可能“具体化”。
    Java的泛型完全是编译期特性,运行期才知道的类型,肯定不能在编码的时候就得到。
    除非,你用啥技术运行期生成Java源代码并编译,不过这就没有意义了,因为泛型是为了简化编码。
      

  11.   

    我觉得既然这样,那就Class类设计成泛型就不够好,明知道大多数情况都是在动态加载时才用Class类,系统中在编译时期已经知道了类型,根本无需要泛型的Class<T>,所以没有必要设计成泛型。
      

  12.   

    楼主的意思可能是,装入时自己也没法知道具体是什么类,因此无法强制转型。
    但是没强制转型的话,就没法使用方法属性之类。如果是如上问题的话,可能有以下解决办法:
    1、使用反射的getMethod,getField等办法操作未知类,但是这样throws会很恶心
    2、尽量在前期制作未知类时指定统一的接口或者基类
      

  13.   

    已经知道动态加载的类型,根本就不须要设计成泛型了.
    如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具用更好的安全性和可读性.
      

  14.   

    我觉得那个T更多的是给interface或者abstract class用的,最典型的就是jdbc接口了。
    你那个不能叫泛型,应该是具体类型,呵呵
      

  15.   

    估计你没有理解我的意思,什么是泛型具体化?
    比如ArrayList是个泛型类
    如果写成 List list = new ArrayList();就算是泛型没有具体化。
    如果写成List<String> list = new ArrayList<String>();这就是泛型具体化。
    Class <T> 这样写是泛型,Class <MyClass>这个就是将Class <T>具体化。
      

  16.   

    呵呵,我最后那句是开玩笑的
    我的意思是说Class<T>中的<T>是给那些Interface跟abstract Class用的,不是你说的没用,手写JDBC连接的时候就能很清楚它的作用了
    特别是,如果你想把要装载的驱动做成动态配置,写在配置文件里面的时候
      

  17.   


    设计成超类确实要转型,泛型其实是在里面为你进行强转,在java虚拟机里面是没有什么泛型类的.
    学习
      

  18.   

    泛型的问题喽!对于泛型的使用看看API吧!应该可以的
      

  19.   

    这种设计应该先定义一个接口,然后Class.forName才有意思,这样就可以
    IMyClass obj = (IMyClass)Class.forName(clzName).newInstance();
    obj.methodA();如果你都确定类名就是com....Test,那么Class.forName就是多余的
      

  20.   

    问题是你觉得你随便定义一个类名在数据库有什么用?
    当然是因为程序需要一个特定的功能,但是实现类可以通过数据库、配置文件等来定义所以都是先定义一个接口,定义了程序中需要的功能接口,然后数据库中保存的实现类。然后在程序中转换成接口调用其中的方法
    如果只是一般的JavaBean,那么也可以通过Introspector.getBeanInfo(...).getPropertyDescriptors()返回有哪些属性
      

  21.   

    其实你说的都对,我这个问题只是想知道如何将Class <T> cls = Class.forName("..."); 具体化,就像Map <S,T> 需要具体化为Map <String,String>一个道理,而不是想知道有没有替代方案,可能你觉得我钻牛角,我承认,呵呵,只是想知道有没有办法实现。谢谢关注,睡觉了。
      

  22.   

    Class<T> 看上去似乎没有任何意义,不知道为什么一定要加个 <T>,也不知道是否有代码中用到了类似楼主的需求 。