论坛首页 Java企业应用论坛

Java获得泛型类型

浏览 55688 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-02-03   最后修改:2010-02-03
本贴的亮点在于这句话:

RednaxelaFX 写道

知道了什么信息有记录,什么信息没有记录之后,也就可以省点力气不去纠结“拿不到T的实际类型”、“建不出T类型的数组”之类的问题了orz


只是 [什么时候记录,什么时候不记录] 的语义上的区分还有些不明确.
0 请登录后投票
   发表时间:2010-02-03  
大牛出现,ORZ了,学习一下,温故知新。
0 请登录后投票
   发表时间:2010-02-03  
AlwenS 写道
本贴的亮点在于这句话:

RednaxelaFX 写道

知道了什么信息有记录,什么信息没有记录之后,也就可以省点力气不去纠结“拿不到T的实际类型”、“建不出T类型的数组”之类的问题了orz


只是 [什么时候记录,什么时候不记录] 的语义上的区分还有些不明确.

声明一侧与使用一侧的两条还是不够用么,呜 TvT
这个要详细写就能赶超楼主写的长度了……去读读Java 5的class文件格式基本上该知道的也就都知道了。
0 请登录后投票
   发表时间:2010-02-03  
利用反射获取泛型  学习了 
0 请登录后投票
   发表时间:2010-02-04  
貌似Class的类型通过Debug我也没发现哪有记录,不知道哪个大牛能拿出来,看看
0 请登录后投票
   发表时间:2010-02-04  
以前获得Class中的泛型类型都是用如下方法:
class BaseService<T extends BaseEntity>
{
  ...
  public Class<T> getClazz() {
        ParameterizedType parameterizedType = (ParameterizedType).getClass().getGenericSuperclass();
        return (Class<T>) parameterizedType.getActualTypeArguments()[0];
    }
}
  
0 请登录后投票
   发表时间:2010-02-04   最后修改:2010-02-04
RednaxelaFX解释的相当的清晰哦,只有类型声明的时候泛型才会写入class,这里的声明包括类,方法,变量(非局部变量),运行时泛型是没有写入class的哦。


综上所述,泛型是编译期行为,但是java通过修改class字节码的方式让程序在运行时可以通过反射来获取类型信息。
0 请登录后投票
   发表时间: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里没这玩儿

   在什么场景下,要这样去获取呢?
0 请登录后投票
   发表时间: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里没这玩儿

   在什么场景下,要这样去获取呢?


比如对于Util类,按说其方法应该是static的,因为用不到this

 

 

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'来的原因

 

 


 

 

0 请登录后投票
   发表时间: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();
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics