泛型如何得到 T.class ?

小灰狼 2017-02-15 03:28:49
类声明了泛型,想在方法中得到泛型的 class,怎么做?
用 T.class 不可以做到
网上倒是有办法,但那个一定要用到继承,我不想莫名其妙地整个父类出来,并且那种方式与我的目标不同

我的代码如下:

public class SerializeUtil<T> {
public String createKey(Object id){
return "Key:" + T.class.getName() + ":" + id.toString();
}

public byte[] serialize(T obj){
// ......
}

public T unserialize(byte[] data){
// ......
}
}

public class Test {
public static void main(String[] args){
Employee emp = ......
SerializeUtil<Employee> su = new SerializeUtil<Employee>();
String strKey = su.createKey(emp.getId());
System.out.println(strKey);
}
}

...全文
1269 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2017-02-17
  • 打赏
  • 举报
回复
自己 up 一下
永远的小鱼 2017-02-17
  • 打赏
  • 举报
回复
public static <T> T getModel(Class<T> t){ T m = null; try { m = t.newInstance(); Method[] mmethod = m.getClass().getMethods(); } catch (Exception e) { e.printStackTrace(); } return m; }
小灰狼 2017-02-17
  • 打赏
  • 举报
回复
引用 7 楼 u013132051 的回复:
http://download.csdn.net/detail/u013132051/9753330 这个反射应该适合你
这里介绍的东西我都用过的,解决不了问题 不过还是感谢你的答复
烟花散尽13141 2017-02-17
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/u013132051/9753330 这个反射应该适合你
小灰狼 2017-02-16
  • 打赏
  • 举报
回复
引用 3 楼 u012576250 的回复:
[quote=引用 2 楼 hemowolf 的回复:] [quote=引用 1 楼 zhj45678 的回复:] 在类上定义一个泛型的字节码 private Class<T> entityClass; 然后再该类的构造里面: Type type = getClass().getGenericSuperclass(); ParameterizedType ptype=(ParameterizedType)type; Type[] types = ptype.getActualTypeArguments(); entityClass=(Class<T>) types[0]; 这样当创建对象的时候,就能拿到泛型的字节码。
这个办法试过的,和网上的差不多,但这个要求继承 这里的 getClass().getGenericSuperclass(); 得到的是 Object,它无法转换为 ParameterizedType[/quote] 可以使用强转的,一楼回答的是正确的。[/quote] OK,发完整代码吧 ParameterizedType ptype=(ParameterizedType)type; 这里出现 ClassCastException 代码如下

package test;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

class Engineer {
}

public class TestT <T>{

	private Class<T> entityClass;
	
	public String createKey(Object keyValue){
		return "Key:" + entityClass.getName() + ":" + keyValue.toString();
	}
	
	public TestT(){
		try{
			Type type = this.getClass().getGenericSuperclass();
			ParameterizedType ptype=(ParameterizedType)type;
			Type[] types = ptype.getActualTypeArguments();
			if(types.length > 0)
				entityClass = (Class<T>)types[0];
			
			for(Type t : types){
				System.out.println(t.toString());
			}
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	public static void main(String[] args){
		TestT<Engineer> obj = new TestT<Engineer>();
		String strKey = obj.createKey(200);
		System.out.println(strKey);
	}
}
七脉 2017-02-16
  • 打赏
  • 举报
回复
引用 2 楼 hemowolf 的回复:
[quote=引用 1 楼 zhj45678 的回复:] 在类上定义一个泛型的字节码 private Class<T> entityClass; 然后再该类的构造里面: Type type = getClass().getGenericSuperclass(); ParameterizedType ptype=(ParameterizedType)type; Type[] types = ptype.getActualTypeArguments(); entityClass=(Class<T>) types[0]; 这样当创建对象的时候,就能拿到泛型的字节码。
这个办法试过的,和网上的差不多,但这个要求继承 这里的 getClass().getGenericSuperclass(); 得到的是 Object,它无法转换为 ParameterizedType[/quote] 可以使用强转的,一楼回答的是正确的。
小灰狼 2017-02-16
  • 打赏
  • 举报
回复
引用 1 楼 zhj45678 的回复:
在类上定义一个泛型的字节码 private Class<T> entityClass; 然后再该类的构造里面: Type type = getClass().getGenericSuperclass(); ParameterizedType ptype=(ParameterizedType)type; Type[] types = ptype.getActualTypeArguments(); entityClass=(Class<T>) types[0]; 这样当创建对象的时候,就能拿到泛型的字节码。
这个办法试过的,和网上的差不多,但这个要求继承 这里的 getClass().getGenericSuperclass(); 得到的是 Object,它无法转换为 ParameterizedType
小灰狼 2017-02-16
  • 打赏
  • 举报
回复
木有人了吗?
zhj45678 2017-02-15
  • 打赏
  • 举报
回复
在类上定义一个泛型的字节码 private Class<T> entityClass; 然后再该类的构造里面: Type type = getClass().getGenericSuperclass(); ParameterizedType ptype=(ParameterizedType)type; Type[] types = ptype.getActualTypeArguments(); entityClass=(Class<T>) types[0]; 这样当创建对象的时候,就能拿到泛型的字节码。

62,616

社区成员

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

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