从界面读取注释值?

时间:2014-02-04 14:46:38

标签: java reflection annotations

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

首先,我创建了一个自定义注释界面。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyBatisMapper {
    String namespace() default "";
    String sqlId() default "";
}

数据库请求dto对象的接口。

public interface IReqDto {    
    public String getDaoType();
}

数据库请求dto对象将实现上述IReqDto接口。

@MyBatisMapper(namespace="User", sqlId="userInsert")
public class UserInsertReqDto implements IReqDto{
    //beans and getters/setters
}

上述bean可能因开发人员的要求而异。这不是框架的一部分。开发人员必须在他使用的任何类型的数据库请求对象中实现IReqDto接口。

我正在尝试的是使用反射从数据库调用程序类中读取带注释的值(namespace and sqlId)。

我知道我可以通过这样做来获得带注释的值。

Class<UserInsertReqDto> ReqDto = UserInsertReqDto.class;        
for(Annotation annotation : ReqDto.getAnnotations()) {
    System.out.println(annotation.toString());
}

但我的问题是,由于UserInsertReqDto会有所不同,我尝试将反射用于IReqDto界面。

Class<IReqDto> ReqDto = IReqDto.class;

嗯,当然不行。 问题是 - 在这种情况下如何从数据库请求对象中读取带注释的值?感谢。

3 个答案:

答案 0 :(得分:1)

也许我仍然误解你的问题,如果有必要,请纠正我。

您将获得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());
}

MyBatisMapper mapperAnnotation = clazz.getAnnotation(MyBatisMapper.class);
if (mapperAnnotation != null) {
    System.out.println(mapperAnnotation.namespace()
    System.out.println(mapperAnnotation.sqlId()
}

答案 1 :(得分:1)

无论何种类型,反射都有效。因此,只需使用Object#getClass()和/或Class<?>,而不是引用具体类。 E.g。

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注释。

答案 2 :(得分:1)

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