Java 从接口读取注释值?

Java 从接口读取注释值?,java,reflection,annotations,Java,Reflection,Annotations,我正在开发一个框架,允许开发人员通过服务层进行数据库操作。服务类将向对象发送数据库请求dto,该对象将使用sql ID进行注释,以用作MyBatis中的ID。稍后我将通过反射读取注释值 首先,我创建了一个自定义注释接口 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyBatisMapper { String namespace() default ""; Strin

我正在开发一个框架,允许开发人员通过服务层进行数据库操作。服务类将向对象发送数据库请求dto,该对象将使用sql ID进行注释,以用作MyBatis中的ID。稍后我将通过反射读取注释值

首先,我创建了一个自定义注释接口

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyBatisMapper {
    String namespace() default "";
    String sqlId() default "";
}
@MyBatisMapper(namespace="User", sqlId="userInsert")
public class UserInsertReqDto implements IReqDto{
    //beans and getters/setters
}
Class<IReqDto> ReqDto = IReqDto.class;
和数据库请求dto对象的接口

public interface IReqDto {    
    public String getDaoType();
}
数据库请求dto对象,该对象将实现上述IReqDto接口

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyBatisMapper {
    String namespace() default "";
    String sqlId() default "";
}
@MyBatisMapper(namespace="User", sqlId="userInsert")
public class UserInsertReqDto implements IReqDto{
    //beans and getters/setters
}
Class<IReqDto> ReqDto = IReqDto.class;
根据开发人员的要求,上述bean可能会有所不同。这不是框架的一部分。开发人员必须在他使用的任何类型的数据库请求对象中实现
IReqDto
接口

我尝试的是使用反射从数据库调用器类读取带注释的值(
名称空间和sqlId

我知道这样做可以得到带注释的值

Class<UserInsertReqDto> ReqDto = UserInsertReqDto.class;        
for(Annotation annotation : ReqDto.getAnnotations()) {
    System.out.println(annotation.toString());
}
嗯,肯定不行。
问题是-在这种情况下,如何从数据库请求对象读取带注释的值?谢谢。

也许我还是误解了你的问题,如果有必要,请纠正我

您将获得
ReqDto

ReqDto object = ...; // get instance
Class<?> clazz = object.getClass(); get actual type of the instance

for(Annotation annotation : clazz.getAnnotations()) { // these are class annotations
    System.out.println(annotation.toString());
}

反射的工作方式与类型无关。因此,不要引用具体的类,只需使用
Object#getClass()
和/或
class
。例如

public Metadata getMetadata(Object pojo) {
   Annotation annotation = pojo.getAnnotation(MyBatisMapper.class);
   if (annotation == null) {
      return null;
   }
   return new Metadata(annotation.getNamespcae(), annotation.getSqlId());
}

其中
Metadata
只是一个值类,您可以稍后使用它来包含有关对象的值。您还可以直接使用MyBatisWrapper注释。

检查spring是如何工作的。您可以在框架中找到一些有用的方法。

只有在存在注释的情况下才能获得注释
UserInsertReqDto
已注释,
IReqDto
未注释。“不清楚你在问什么。”SotiriosDelimanolis为这个未澄清的问题感到抱歉
UserInsertReqDto
就是一个例子。只有当框架的用户创建它时,它才会存在。我必须在框架中准备获得实现
IReqDto
ReqDto
类的注释。谢谢您的时间,先生。只需修复
注释
变量的声明类型。和
pojo.getClass().getAnnotation..