Java 8具有稱爲類型註釋(JSR 308)的功能。我想將它用於簡單的Object to Object映射器框架。我想定義註釋@ExpectedType這樣如何在Java中使用自定義類型註釋
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
,然後用它在我的代碼是這樣的:
public class SomeServiceImpl() {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj; // it's correct
}
}
IObjectA
是類ObjectA_DTO
和ObjectA_Entity
實現的接口。我想用這種方式的服務:
// it's correct
assert someService.doSomething(new ObjectA_DTO()).getClass() == ObjectA_DTO.class;
我想改變調用SomeServiceImpl方法來使用Object映射器。它可以通過使用JSR 269或AOP生成的代碼來實現。
問題是我寫了簡單的註釋處理器,它根本不處理類型註釋。簡單的註釋處理器的來源是這樣的:
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class SimpleAnnotationsProcessor extends AbstractProcessor {
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Messager messager = processingEnv.getMessager();
try {
for (TypeElement e : annotations) {
messager.printMessage(Diagnostic.Kind.NOTE, e.toString());
for (Element elem : roundEnv.getElementsAnnotatedWith(e)) {
messager.printMessage(Diagnostic.Kind.NOTE, elem.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
任何想法如何使用或如何SimpleAnnotationsProcessor訪問類型的註釋?可插入註釋處理API的使用對我來說不是必要的我認爲它比Java反射會有更好的性能。無論如何,我不知道如何通過Java Reflection訪問類型註釋。
使用我猜我不清楚你想達到什麼目標。爲什麼不只是讓方法簽名'ObjectA_DTO doSomething(ObjectA_Entity)',如果這就是你期望的呢? –
方法簽名不能這樣,因爲我想使用像這個'someService.doSomething(new ObjectA_DTO())'這樣的服務實例。我想實現對象映射器來映射'ObjectA_DTO'到'ObjectA_Entity',並且類型註釋@ExpectedType定義了目標類型。這是簽名必須是'IObjectA doSomething(IObjectA)'的原因。 –
我剛剛發現你的問題......我在處理註釋的產品線開發中完成了一個學期的項目。現在,我將給你留下這個重要的教程,它真的讓我討論這個主題(你可以跳過關於代碼生成的第3部分) - https://deors.wordpress.com/2011/09/26/annotation-types/稍後,我會重新檢查這個帖子的進展情況。 – ThisClark