[英]How to use custom type annotations in Java
Java 8具有名为Type annotations( JSR 308 )的功能。 我想将它用于简单的Object to Object映射器框架。 我想像这样定义注释@ExpectedType
@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 mapper。 它可以通过使用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访问类型注释。
我不确定我理解你想要实现的目标,但这里有一个例子,你可以用Java反射api访问你的注释:
package test;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Method;
public class TypeParameterTest {
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExpectedType {
public Class<?> value();
}
public static interface IObjectA {}
public static class ObjectA_DTO implements IObjectA {}
public static class ObjectA_Entity implements IObjectA {}
public static class SomeServiceImpl {
public @ExpectedType(ObjectA_DTO.class) IObjectA doSomething(@ExpectedType(ObjectA_Entity.class) IObjectA obj) {
return (ObjectA_Entity) obj;
}
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
Method m = SomeServiceImpl.class.getMethod("doSomething", IObjectA.class);
AnnotatedType returnType = m.getAnnotatedReturnType();
Annotation returnTypeAnnotation = returnType.getAnnotation(ExpectedType.class);
System.out.println(returnTypeAnnotation);
AnnotatedType[] parameters = m.getAnnotatedParameterTypes();
for (AnnotatedType p : parameters) {
Annotation parameterAnnotation = p.getAnnotation(ExpectedType.class);
System.out.println(parameterAnnotation);
}
}
}
输出如下所示:
@test.TypeParameterTest$ExpectedType(value=class test.TypeParameterTest$ObjectA_DTO)
@test.TypeParameterTest$ExpectedType(value=class test.TypeParameterTest$ObjectA_Entity)
不过请注意,并非所有可能类型的注释通过反射API访问,但如果需要的话可以随时从字节码读取(请参阅我的答案在这里 )。
我认为你在运行时混淆了注释的使用,而不是在“编译”时使用各种工具。 Processor
接口用于工具(编译器,javadoc生成器),而不是在运行时代码中。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface SearchDefinition {
public String identifier() default "";
}
@SearchDefinition - 可以在任何地方使用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.