Class<?> cls = Class.forName("com.code.Test"); 这个?怎么具体化,因为Test类是运行时动态加载的,所以我想不到办 Class<?> cls = Class.forName("com.code.Test"); 这个?怎么具体化,因为Test类是运行时动态加载的,所以我想不到办法让泛型具体化. 不具体化也不影响我的使用,只是我想看看有没有什么方法可以具体化。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Test类的代码,在系统中没有,在运行的时候动态读取Class文件加载进虚拟机的。 Class cls = Test.class;//得到当前类对应的ClassTest test = (Test)cls.forName();//此方法返回值为Object,可向下转型为Test对象 第一:Class <?> cls = Class.forName("com.code.Test"); 可能没明白我的意思,我要的是把?具体化,就像Map<?,?> 需要具体化为Map<String,String>一样。第二:针对你说的,Test类在系统中没有,你怎么转? cls.newInstance().getClass();是那个的真正的类型,不是太明白楼主的意思。 LZ的意思是将?替换成具体的class类型,这个明显不可能具体到test啊,既然你说是运行时动态装载的Test,那编译的时候恐怕还不知道Test吧;怎么可能具体?顶多就只能指定到它的super class,如果还不知道,就一直上溯到Object吧,呵呵 // 如果要类的实例Object instance = cls.newInstance();Test test = (Test)instance;// .... 如果编译期 com.code.Test 类不存在要在代码中直接把 cls 用作 Class<com.code.Test>, 应该不行的吧 你说的非常正确,如果这样可以的话,我就不用在这里问了。com.code.Test 类,我在系统运行起来后才设计的,而且可以随意设计很多。这才是动态加载。 cls.newInstance().getClass() 跟Class.forName("com.code.Test") 返回的类型没有区别,不过这跟我说的问题无关。 不用头疼了,完全不可能“具体化”。Java的泛型完全是编译期特性,运行期才知道的类型,肯定不能在编码的时候就得到。除非,你用啥技术运行期生成Java源代码并编译,不过这就没有意义了,因为泛型是为了简化编码。 我觉得既然这样,那就Class类设计成泛型就不够好,明知道大多数情况都是在动态加载时才用Class类,系统中在编译时期已经知道了类型,根本无需要泛型的Class<T>,所以没有必要设计成泛型。 楼主的意思可能是,装入时自己也没法知道具体是什么类,因此无法强制转型。但是没强制转型的话,就没法使用方法属性之类。如果是如上问题的话,可能有以下解决办法:1、使用反射的getMethod,getField等办法操作未知类,但是这样throws会很恶心2、尽量在前期制作未知类时指定统一的接口或者基类 已经知道动态加载的类型,根本就不须要设计成泛型了.如果要?具体就用超类型限定: <? super TestFather> 加载的Class只能是TestFather子类.使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具用更好的安全性和可读性. 我觉得那个T更多的是给interface或者abstract class用的,最典型的就是jdbc接口了。你那个不能叫泛型,应该是具体类型,呵呵 估计你没有理解我的意思,什么是泛型具体化?比如ArrayList是个泛型类如果写成 List list = new ArrayList();就算是泛型没有具体化。如果写成List<String> list = new ArrayList<String>();这就是泛型具体化。Class <T> 这样写是泛型,Class <MyClass>这个就是将Class <T>具体化。 呵呵,我最后那句是开玩笑的我的意思是说Class<T>中的<T>是给那些Interface跟abstract Class用的,不是你说的没用,手写JDBC连接的时候就能很清楚它的作用了特别是,如果你想把要装载的驱动做成动态配置,写在配置文件里面的时候 设计成超类确实要转型,泛型其实是在里面为你进行强转,在java虚拟机里面是没有什么泛型类的.学习 泛型的问题喽!对于泛型的使用看看API吧!应该可以的 这种设计应该先定义一个接口,然后Class.forName才有意思,这样就可以IMyClass obj = (IMyClass)Class.forName(clzName).newInstance();obj.methodA();如果你都确定类名就是com....Test,那么Class.forName就是多余的 问题是你觉得你随便定义一个类名在数据库有什么用?当然是因为程序需要一个特定的功能,但是实现类可以通过数据库、配置文件等来定义所以都是先定义一个接口,定义了程序中需要的功能接口,然后数据库中保存的实现类。然后在程序中转换成接口调用其中的方法如果只是一般的JavaBean,那么也可以通过Introspector.getBeanInfo(...).getPropertyDescriptors()返回有哪些属性 其实你说的都对,我这个问题只是想知道如何将Class <T> cls = Class.forName("..."); 具体化,就像Map <S,T> 需要具体化为Map <String,String>一个道理,而不是想知道有没有替代方案,可能你觉得我钻牛角,我承认,呵呵,只是想知道有没有办法实现。谢谢关注,睡觉了。 Class<T> 看上去似乎没有任何意义,不知道为什么一定要加个 <T>,也不知道是否有代码中用到了类似楼主的需求 。 Eclipse的Console问题 谁有JavaMail API 中文帮助文档、 chm格式的。。 java数组叠加问题 JTextArea滚动条问题 上课老师留的算法题,进来看看 单立模式的问题,实例化怎么这么麻烦呢 用javac怎样编译一个目录及他的所有子目录? 急求 java List排序问题 请教JComboBox如何能捕获到回车事件 有人用IntelliJ IDEA写JAVA程序吗?问个关于设置的问题 问题。 问一个关于线程同步的小白问题,大家指点一下。
Test test = (Test)cls.forName();//此方法返回值为Object,可向下转型为Test对象
第二:针对你说的,Test类在系统中没有,你怎么转?
// 如果要类的实例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变量,然后再进行强制类型转换的代码具用更好的安全性和可读性.
你那个不能叫泛型,应该是具体类型,呵呵
比如ArrayList是个泛型类
如果写成 List list = new ArrayList();就算是泛型没有具体化。
如果写成List<String> list = new ArrayList<String>();这就是泛型具体化。
Class <T> 这样写是泛型,Class <MyClass>这个就是将Class <T>具体化。
我的意思是说Class<T>中的<T>是给那些Interface跟abstract Class用的,不是你说的没用,手写JDBC连接的时候就能很清楚它的作用了
特别是,如果你想把要装载的驱动做成动态配置,写在配置文件里面的时候
设计成超类确实要转型,泛型其实是在里面为你进行强转,在java虚拟机里面是没有什么泛型类的.
学习
IMyClass obj = (IMyClass)Class.forName(clzName).newInstance();
obj.methodA();如果你都确定类名就是com....Test,那么Class.forName就是多余的
当然是因为程序需要一个特定的功能,但是实现类可以通过数据库、配置文件等来定义所以都是先定义一个接口,定义了程序中需要的功能接口,然后数据库中保存的实现类。然后在程序中转换成接口调用其中的方法
如果只是一般的JavaBean,那么也可以通过Introspector.getBeanInfo(...).getPropertyDescriptors()返回有哪些属性