Class cls = Class.forName("com.code.Test"); 这个?怎么具体化,因为Test类是运行时动态加载的,所以我想不到办

左大神在这 2010-01-25 04:22:20
Class<?> cls = Class.forName("com.code.Test"); 这个?怎么具体化,因为Test类是运行时动态加载的,所以我想不到办法让泛型具体化. 不具体化也不影响我的使用,只是我想看看有没有什么方法可以具体化。
...全文
748 33 打赏 收藏 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
ipeng2012 2011-12-29
  • 打赏
  • 举报
回复
我也在纠结这个问题
humanity 2010-01-31
  • 打赏
  • 举报
回复
Class<T> 看上去似乎没有任何意义,不知道为什么一定要加个 <T>,也不知道是否有代码中用到了类似楼主的需求 。
左大神在这 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 chdw 的回复:]
问题是你觉得你随便定义一个类名在数据库有什么用?
当然是因为程序需要一个特定的功能,但是实现类可以通过数据库、配置文件等来定义

所以都是先定义一个接口,定义了程序中需要的功能接口,然后数据库中保存的实现类。然后在程序中转换成接口调用其中的方法


如果只是一般的JavaBean,那么也可以通过Introspector.getBeanInfo(...).getPropertyDescriptors()返回有哪些属性
[/Quote]
其实你说的都对,我这个问题只是想知道如何将Class <T> cls = Class.forName("..."); 具体化,就像Map <S,T> 需要具体化为Map <String,String>一个道理,而不是想知道有没有替代方案,可能你觉得我钻牛角,我承认,呵呵,只是想知道有没有办法实现。谢谢关注,睡觉了。
ChDw 2010-01-29
  • 打赏
  • 举报
回复
问题是你觉得你随便定义一个类名在数据库有什么用?
当然是因为程序需要一个特定的功能,但是实现类可以通过数据库、配置文件等来定义

所以都是先定义一个接口,定义了程序中需要的功能接口,然后数据库中保存的实现类。然后在程序中转换成接口调用其中的方法


如果只是一般的JavaBean,那么也可以通过Introspector.getBeanInfo(...).getPropertyDescriptors()返回有哪些属性
左大神在这 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 feisxie 的回复:]
泛型的问题喽!对于泛型的使用看看API吧!应该可以的
[/Quote]
能说明白一点吗?具体如何处理。
左大神在这 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 chdw 的回复:]
这种设计应该先定义一个接口,然后Class.forName才有意思,这样就可以
IMyClass obj = (IMyClass)Class.forName(clzName).newInstance();
obj.methodA();

如果你都确定类名就是com....Test,那么Class.forName就是多余的
[/Quote]
当然不确定类名,这里只是举例而已,实际应用中,一般是将类名保存到数据表中,后配置文件中,或临时生成的。
定义接口是没用的,定义接口只能实现强制转型,跟我的要求不一致。
ChDw 2010-01-29
  • 打赏
  • 举报
回复
这种设计应该先定义一个接口,然后Class.forName才有意思,这样就可以
IMyClass obj = (IMyClass)Class.forName(clzName).newInstance();
obj.methodA();

如果你都确定类名就是com....Test,那么Class.forName就是多余的
feisxie 2010-01-29
  • 打赏
  • 举报
回复
泛型的问题喽!对于泛型的使用看看API吧!应该可以的
java1109 2010-01-29
  • 打赏
  • 举报
回复
高深的问题
左大神在这 2010-01-29
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 wzju64676266 的回复:]
楼主的意思很明确,我也一直在想这个问题,希望能得到哪位高手的指点
[/Quote]
呵呵,估计没答案
wzju64676266 2010-01-29
  • 打赏
  • 举报
回复
楼主的意思很明确,我也一直在想这个问题,希望能得到哪位高手的指点
wenjjing2lianee 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 chuan122345 的回复:]
引用 16 楼 wenjjing2lianee 的回复:
已经知道动态加载的类型,根本就不须要设计成泛型了.
如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.

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




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

设计成超类确实要转型,泛型其实是在里面为你进行强转,在java虚拟机里面是没有什么泛型类的.
学习
windgh 2010-01-26
  • 打赏
  • 举报
回复
呵呵,我最后那句是开玩笑的
我的意思是说Class<T>中的<T>是给那些Interface跟abstract Class用的,不是你说的没用,手写JDBC连接的时候就能很清楚它的作用了
特别是,如果你想把要装载的驱动做成动态配置,写在配置文件里面的时候
左大神在这 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 windgh 的回复:]
引用 14 楼 chuan122345 的回复:
引用 13 楼 weihthchk 的回复:
不用头疼了,完全不可能“具体化”。
Java的泛型完全是编译期特性,运行期才知道的类型,肯定不能在编码的时候就得到。
除非,你用啥技术运行期生成Java源代码并编译,不过这就没有意义了,因为泛型是为了简化编码。

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

我觉得那个T更多的是给interface或者abstract class用的,最典型的就是jdbc接口了。
你那个不能叫泛型,应该是具体类型,呵呵
[/Quote]
估计你没有理解我的意思,什么是泛型具体化?
比如ArrayList是个泛型类
如果写成 List list = new ArrayList();就算是泛型没有具体化。
如果写成List<String> list = new ArrayList<String>();这就是泛型具体化。
Class <T> 这样写是泛型,Class <MyClass>这个就是将Class <T>具体化。
左大神在这 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wenjjing2lianee 的回复:]
已经知道动态加载的类型,根本就不须要设计成泛型了.
如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.

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



[/Quote]

即使设计超类,也不能解决问题。
因为那样你也要强制转型,而强制转型不是泛型类的具体化,泛型具体化的时候是不需要强制转型的,编译器可以自动识别的。
左大神在这 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 smartcatiboy 的回复:]
楼主的意思可能是,装入时自己也没法知道具体是什么类,因此无法强制转型。
但是没强制转型的话,就没法使用方法属性之类。

如果是如上问题的话,可能有以下解决办法:
1、使用反射的getMethod,getField等办法操作未知类,但是这样throws会很恶心
2、尽量在前期制作未知类时指定统一的接口或者基类
[/Quote]
你说的对,动态加载的类,本身就是这样使用的。对这个问题,我在问的时候就知道是没办法解决的,可能也没有必要解决,我只是对这个问题比较好奇。我以为任何情况下,泛型类都可以具体化,想不到这种情况是无法具体话的。
另外说明,强制转型不是泛型类的具体化。
泛型具体化的时候是不需要强制转型的
windgh 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chuan122345 的回复:]
引用 13 楼 weihthchk 的回复:
不用头疼了,完全不可能“具体化”。
Java的泛型完全是编译期特性,运行期才知道的类型,肯定不能在编码的时候就得到。
除非,你用啥技术运行期生成Java源代码并编译,不过这就没有意义了,因为泛型是为了简化编码。

我觉得既然这样,那就Class类设计成泛型就不够好,明知道大多数情况都是在动态加载时才用Class类,系统中在编译时期已经知道了类型,根本无需要泛型的Class <T>,所以没有必要设计成泛型。
[/Quote]
我觉得那个T更多的是给interface或者abstract class用的,最典型的就是jdbc接口了。
你那个不能叫泛型,应该是具体类型,呵呵
wenjjing2lianee 2010-01-26
  • 打赏
  • 举报
回复
已经知道动态加载的类型,根本就不须要设计成泛型了.
如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.

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




smartcatiboy 2010-01-26
  • 打赏
  • 举报
回复
楼主的意思可能是,装入时自己也没法知道具体是什么类,因此无法强制转型。
但是没强制转型的话,就没法使用方法属性之类。

如果是如上问题的话,可能有以下解决办法:
1、使用反射的getMethod,getField等办法操作未知类,但是这样throws会很恶心
2、尽量在前期制作未知类时指定统一的接口或者基类
左大神在这 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 weihthchk 的回复:]
不用头疼了,完全不可能“具体化”。
Java的泛型完全是编译期特性,运行期才知道的类型,肯定不能在编码的时候就得到。
除非,你用啥技术运行期生成Java源代码并编译,不过这就没有意义了,因为泛型是为了简化编码。
[/Quote]
我觉得既然这样,那就Class类设计成泛型就不够好,明知道大多数情况都是在动态加载时才用Class类,系统中在编译时期已经知道了类型,根本无需要泛型的Class<T>,所以没有必要设计成泛型。
加载更多回复(13)

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧