java - 通过反射获取 super 接口(interface)的泛型类型

标签 java reflection

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/

相关文章:

c# - 使用反射的比较运算符

java - 是否有可能将一个对象转换为与所有java版本中的抽象父对象(而不是其父对象)具有完全相同结构的对象?

父类(super class)中子类的C++调用方法?

java - 无法使用 Ant 删除文件

Java-Redis : Pool of 300+ connections possible?

java - 错误 : java. security.cert.CertificateException : Illegal given domain name: abc_xyz. stg.myweb.com

BlackBerry JRE独立java编码

java - 如何从资源文件夹加载文件?

java - 我可以使用正则表达式来查找java中类的方法吗?

java - Realm java,如何通过字符串访问 RealmObject 属性(反射)