日期:2014-05-20  浏览次数:20792 次

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

------解决方案--------------------
转型
------解决方案--------------------
Class cls = Test.class;//得到当前类对应的Class
Test test = (Test)cls.forName();//此方法返回值为Object,可向下转型为Test对象
------解决方案--------------------
cls.newInstance().getClass();是那个的真正的类型,不是太明白楼主的意思。
------解决方案--------------------
LZ的意思是将?替换成具体的class类型,这个明显不可能具体到test啊,既然你说是运行时动态装载的Test,那编译的时候恐怕还不知道Test吧;怎么可能具体?顶多就只能指定到它的super class,如果还不知道,就一直上溯到Object吧,呵呵
------解决方案--------------------
Java code

// 如果要类的实例

Object instance = cls.newInstance();
Test test = (Test)instance;

// ....

------解决方案--------------------

如果编译期 com.code.Test 类不存在

要在代码中直接把 cls 用作 Class<com.code.Test>, 应该不行的吧


------解决方案--------------------
不用头疼了,完全不可能“具体化”。
Java的泛型完全是编译期特性,运行期才知道的类型,肯定不能在编码的时候就得到。
除非,你用啥技术运行期生成Java源代码并编译,不过这就没有意义了,因为泛型是为了简化编码。
------解决方案--------------------
楼主的意思可能是,装入时自己也没法知道具体是什么类,因此无法强制转型。
但是没强制转型的话,就没法使用方法属性之类。

如果是如上问题的话,可能有以下解决办法:
1、使用反射的getMethod,getField等办法操作未知类,但是这样throws会很恶心
2、尽量在前期制作未知类时指定统一的接口或者基类
------解决方案--------------------
已经知道动态加载的类型,根本就不须要设计成泛型了.
如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.

使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具用更好的安全性和可读性.





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

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

------解决方案--------------------
呵呵,我最后那句是开玩笑的
我的意思是说Class<T>中的<T>是给那些Interface跟abstract Class用的,不是你说的没用,手写JDBC连接的时候就能很清楚它的作用了
特别是,如果你想把要装载的驱动做成动态配置,写在配置文件里面的时候
------解决方案--------------------
探讨
引用:
已经知道动态加载的类型,根本就不须要设计成泛型了.
如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.

使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具用更好的安全性和可读性.




即使设计超类,也不能解决问题。
因为那样你也要强制转型,而强制转型不是泛型类的具体化,泛型具体化的时候是不需要强制转型的,编译器可以自动识别的。

------解决方案--------------------
楼主的意思很明确,我也一直在想这个问题,希望能得到哪位高手的指点
------解决方案--------------------
高深的问题
------解决方案--------------------
泛型的问题喽!对于泛型的使用看看API吧!应该可以的
------解决方案--------------------
这种设计应该先定义一个接口,然后Class.forName才有意思,这样就可以
IMyClass obj = (IMyClass)Class.forName(clzName).newInstance();
obj.methodA();

如果你都确定类名就是com....Test,那么Class.forName就是多余的
------解决方案--------------------
问题是你觉得你随便定义一个类名在数据库有什么用?
当然是因为程序需要一个特定的功能,但是实现类可以通过数据库、配置文件等来定义