查找对象的参数化注释的运行时类类型

Posted

技术标签:

【中文标题】查找对象的参数化注释的运行时类类型【英文标题】:Find runtime classtype of an object's parametrized annotation 【发布时间】:2014-09-09 13:13:45 【问题描述】:

我想检索在对象的参数化标记接口上找到的泛型类型的实际类。这甚至可能吗?

标记界面:

public interface MarkerInterface<T> 

我想要的方法:

public class findClassForParametrizedMarkerInterface(MarkerInterface<T> markedObjectThatCouldExtendSomeRandomClass)

    //How to retrieve the class T, or it's name?


对于那些想知道我为什么要这样做的人: 对于一些重型 jpa 实体,我有多个 dto jpa 实体。我想创建一个通用服务,为提供的 dto 检索正确的完整实体 spring 数据 jpa 存储库。 dto 有一个标记接口,它将完整实体类指定为参数化的泛型类型。

【问题讨论】:

【参考方案1】:

编辑:可以在Get generic type of class at runtime 找到一个很好的讨论。最简单的解决方案是在对象实例化时传递对类的引用。维护对此类的引用以在需要时返回。这是因为 Java 在运行时没有保留泛型。如果您想使用详细反射 api 来检索通用信息,则元数据中提供了通用信息。

在对象本身上使用getClass()

公共最终类 getClass() 返回此 Object 的运行时类。返回的 Class 对象是被表示类的静态同步方法锁定的对象。 实际结果类型是 Class where |X|是调用 getClass 的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:

数字 n = 0; 类 c = n.getClass();

返回: 表示此对象的运行时类的 Class 对象。 也可以看看: 文字,Java™ 语言规范的第 15.8.2 节。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#getClass()

【讨论】:

他们要求的不是这个

以上是关于查找对象的参数化注释的运行时类类型的主要内容,如果未能解决你的问题,请参考以下文章

在运行时修改类定义的注释字符串参数

反射--03--运行时类对象

通过反射来创建对应运行时类的对象

Java 反射--创建运行时类的对象

Java 反射机制:创建运行时类的对象

反射2.0