锁定老帖子 主题:Java获得泛型类型
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-02-03
最后修改:2010-02-03
本贴的亮点在于这句话:
RednaxelaFX 写道 知道了什么信息有记录,什么信息没有记录之后,也就可以省点力气不去纠结“拿不到T的实际类型”、“建不出T类型的数组”之类的问题了orz 只是 [什么时候记录,什么时候不记录] 的语义上的区分还有些不明确. |
|
返回顶楼 | |
发表时间:2010-02-03
大牛出现,ORZ了,学习一下,温故知新。
|
|
返回顶楼 | |
发表时间:2010-02-03
AlwenS 写道 本贴的亮点在于这句话: RednaxelaFX 写道 知道了什么信息有记录,什么信息没有记录之后,也就可以省点力气不去纠结“拿不到T的实际类型”、“建不出T类型的数组”之类的问题了orz 只是 [什么时候记录,什么时候不记录] 的语义上的区分还有些不明确. 声明一侧与使用一侧的两条还是不够用么,呜 TvT 这个要详细写就能赶超楼主写的长度了……去读读Java 5的class文件格式基本上该知道的也就都知道了。 |
|
返回顶楼 | |
发表时间:2010-02-03
利用反射获取泛型 学习了
|
|
返回顶楼 | |
发表时间:2010-02-04
貌似Class的类型通过Debug我也没发现哪有记录,不知道哪个大牛能拿出来,看看
|
|
返回顶楼 | |
发表时间:2010-02-04
以前获得Class中的泛型类型都是用如下方法:
class BaseService<T extends BaseEntity> { ... public Class<T> getClazz() { ParameterizedType parameterizedType = (ParameterizedType).getClass().getGenericSuperclass(); return (Class<T>) parameterizedType.getActualTypeArguments()[0]; } } |
|
返回顶楼 | |
发表时间:2010-02-04
最后修改:2010-02-04
RednaxelaFX解释的相当的清晰哦,只有类型声明的时候泛型才会写入class,这里的声明包括类,方法,变量(非局部变量),运行时泛型是没有写入class的哦。
综上所述,泛型是编译期行为,但是java通过修改class字节码的方式让程序在运行时可以通过反射来获取类型信息。 |
|
返回顶楼 | |
发表时间:2010-02-04
RednaxelaFX 写道 bonny 写道 class Domain{ public static Class getCurrentDomainClass(){ //获取运行时类型 } } class User() extends Domain{ } class Test { @Test public void test(){ User.getCurrentDomainClass();//。。。。无法获取User.class } } 这个功能我找了很久,貌似无法实现。 这个确实是不行。如果不是静态方法而是成员方法的话还有点可能,好歹能拿到“this” 话说这让我想起以前别人提出“为什么不弄个'static virtual method'呢?”,不过现实是Java里没这玩儿 在什么场景下,要这样去获取呢? |
|
返回顶楼 | |
发表时间:2010-02-06
myworkfirst 写道
RednaxelaFX 写道
bonny 写道
class Domain{ public static Class getCurrentDomainClass(){ //获取运行时类型 } } class User() extends Domain{ } class Test { @Test public void test(){ User.getCurrentDomainClass();//。。。。无法获取User.class } } 这个功能我找了很久,貌似无法实现。 这个确实是不行。如果不是静态方法而是成员方法的话还有点可能,好歹能拿到“this” 话说这让我想起以前别人提出“为什么不弄个'static virtual method'呢?”,不过现实是Java里没这玩儿 在什么场景下,要这样去获取呢?
class ParentUtil{ public static void foo(Parent p){}; } class ChildUtil extends ParentUtil{ public static void foo(Parent p){}; } class NeedParentUtil{ public ParentUtil util; public void foo(){ util.foo(new Parent()); //这里一定会调ParentUtil.foo(),即使你传进一个ChildUtil.foo()给NeedParentUtil } }
但由于static不能继承,以上的代码是无用的,所以只能写成以下这种方式
class ParentUtil{ public void foo(Parent p){}; //为什么?明明没有用到this,我还得声明成 non static method } class ChildUtil extends ParentUtil{ public void foo(Parent p){}; } class NeedParentUtil{ public ParentUtil util; public void foo(){ util.foo(new Parent()); } }
同时,我还得寄希望于IOC容器能够保证不会new出超过一个XXUtil,占用可怜的内存。
根本原因嘛,为了用到继承,我就得new出一个instance来。这就是为什么会希望搞出一个'static virtual method'来的原因
|
|
返回顶楼 | |
发表时间:2010-02-11
iamlotus 写道 <div class="quote_title">myworkfirst 写道</div>
<div class="quote_div"> <div class="quote_title">RednaxelaFX 写道</div> <div class="quote_div"> <div class="quote_title">bonny 写道</div> <div class="quote_div"> class Domain{ public static Class getCurrentDomainClass(){ //获取运行时类型 } } class User() extends Domain{ } class Test { @Test public void test(){ User.getCurrentDomainClass();//。。。。无法获取User.class } } <br><br>这个功能我找了很久,貌似无法实现。</div> <br>这个确实是不行。如果不是静态方法而是成员方法的话还有点可能,好歹能拿到“this” <br>话说这让我想起以前别人提出“为什么不弄个'static virtual method'呢?”,不过现实是Java里没这玩儿</div> <br> 在什么场景下,要这样去获取呢? <br> </div> <br>比如对于Util类,按说其方法应该是static的,因为用不到this class ParentUtil{ public <span style="color: #ff0000;">static</span> void foo(Parent p){}; } class ChildUtil extends ParentUtil{ public <span style="color: #ff0000;">static</span> void foo(Parent p){}; } class NeedParentUtil{ public ParentUtil util; public void foo(){ util.foo(new Parent()); //这里一定会调ParentUtil.foo(),即使你传进一个ChildUtil.foo()给NeedParentUtil } } 但由于static不能继承,以上的代码是无用的,所以只能写成以下这种方式 class ParentUtil{ public void foo(Parent p){}; //为什么?明明没有用到this,我还得声明成 non static method } class ChildUtil extends ParentUtil{ public void foo(Parent p){}; } class NeedParentUtil{ public ParentUtil util; public void foo(){ util.foo(new Parent()); } } 同时,我还得寄希望于IOC容器能够保证不会new出超过一个XXUtil,占用可怜的内存。 根本原因嘛,为了用到继承,我就得new出一个instance来。这就是为什么会希望搞出一个'static virtual method'来的原因 <br> 我不是太明白,既然是工具类,为什么要用继承的形式,这样的设计是不是欠考虑?工具类本身就是为执行特定操作而生,只是一个面向过程的概念。。。为什么要面向对象?? 还有就是你说的问题可以考虑使用调用栈读取,静态类型无法获得this,但是可以在线程上做文章 StackTraceElement[] stack = Thread.currentThread().getStackTrace(); |
|
返回顶楼 | |