您的位置:首页 > 其它

求泛型的Class

2015-10-31 22:30 239 查看
项目开发中为了减少重复代码,常常会使用到Java泛型。有时候就需要求泛型的类型。

GenericFoo.java是基类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
* Created by li on 2015/10/31.
*/
public abstract class GenericFoo<T> {
protected Logger logger = LoggerFactory.getLogger(this.getClass());

private Class<T> beanClass;

public Class<T> getBeanClass(){
logger.debug("this: " + this.getClass() + "\t Super: " + getClass().getGenericSuperclass());
Type type =getClass().getGenericSuperclass();
//        if (!ParameterizedType.class.isAssignableFrom(type.getClass())) {
//            return null;
//        }
ParameterizedType paraType = (ParameterizedType)getClass().getGenericSuperclass();
logger.debug(type.toString());
beanClass = (Class<T>) paraType.getActualTypeArguments()[0];
logger.debug("beanClass: " + beanClass);
return this.beanClass;
}
}
GenericFooChild.java是子类

public class GenericFooChild<T> extends GenericFoo {

}
编写Junit测试类

import com.cqs.models.user.model.User;
import org.junit.Test;

/**
* Created by li on 2015/10/31.
*/
public class GenericFooChildTest {

private GenericFooChild child = new GenericFooChild();

@Test
public void testGetBeanClass() throws Exception {
child.getBeanClass();
}
}


运行结果



查了一些帖子:子类(GenericFooChild)在集成父类(GenericFoo)时不能还写抽象类,需要传入具体的类别

所以:

需要将GenericFooChild修改为:

import com.cqs.models.user.model.User;

/**
* Created by li on 2015/10/31.
*/
public class GenericFooChild extends GenericFoo<User> {

}


运行结果



还有一个一种办法可以求泛型的类型:

在构造器中,传入具体的泛型类型:

父类修改为【添加含参构造函数,getBeanClass()可以直接返回beanClass】:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Created by li on 2015/10/31.
*/
public abstract class GenericFoo<T> {
protected Logger logger = LoggerFactory.getLogger(this.getClass());

private Class<T> beanClass;

public GenericFoo(Class<T> beanClass) {
this.beanClass = beanClass;
}

public Class<T> getBeanClass(){
logger.debug("beanClass: " + beanClass);
return this.beanClass;
}
}



子类和JUnit测试类,也要相应的修改

import com.cqs.models.user.model.User;

/**
* Created by li on 2015/10/31.
*/
public class GenericFooChild extends GenericFoo<User> {

public GenericFooChild(Class<User> beanClass) {
super(beanClass);
}
}


import com.cqs.models.user.model.User;
import org.junit.Test;

/**
* Created by li on 2015/10/31.
*/
public class GenericFooChildTest {

private GenericFooChild child = new GenericFooChild(User.class);

@Test
public void testGetBeanClass() throws Exception {
child.getBeanClass();
}
}


运行结果:



参考:(翻译)反射处理java泛型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: