interface BaseDao<T> { }
interface UserDao extends BaseDao<User> { }
interface DeptDao extends BaseDao<Department> { }
我需要一个通过 Dao
类获取 Entity
类的函数,如下所示:
func(UserDao.class) return User.class
func(DeptDao.class) return Deparment.class
而且我不喜欢向dao
添加注释
,如下所示:
@Entity(User.class)
interface UserDao extends BaseDao
------------------------------------------------------------ ----------
受到 dimo414 的建议的启发,这是我的解决方案:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Main {
public static void main(String[] args) {
// if A and B are Class, then it be 'B.class.getGenericSuperclass()'
Type genType = B.class.getGenericInterfaces()[0];
if (genType instanceof ParameterizedType) {
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
Class<?> clz = (Class) params[0];
System.out.println(clz); // class java.lang.String
}
}}
interface A<T> {}
interface B extends A<String> {}
最佳答案
看看 Guava 的 TypeToken
,这就是(我认为)你所描述的。更多详细信息请参阅Reflection Explained文章。
TypeCapture.capture()
方法获取父类的泛型类型:
Type capture() {
Type superclass = getClass().getGenericSuperclass();
checkArgument(superclass instanceof ParameterizedType, "%s isn't parameterized", superclass);
return ((ParameterizedType) superclass).getActualTypeArguments()[0];
}
这就是 TypeToken
的“魔力”如何发挥作用。
关于java - 通过反射获取 super 接口(interface)的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42038119/