Java - 注释处理
Java - Annotation Processing
我有一个注释,它标记 classes 包含一个内部 class,它实现了一个命名接口。
下面是如何使用此注释的示例:
public interface Implementable {}
@Deserializable(Implementable.class)
public class ImplementableFactory {
public static Implementable getImplementable() {
return new Impl();
}
private class Impl implements Implementable {}
}
这里是注释本身:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public @interface Deserializable {
Class value();
}
我想做一些注释处理来确保这个合同。为此,我创建了一个注释处理器 class:
public class DeserializableProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for(Element element : roundEnv.getElementsAnnotatedWith(Deserializable.class)){
TypeMirror expected = getDeserializableValue(element);
if (expected != null) {
Boolean found = false;
for (Element enclosed : element.getEnclosedElements()) {
if (enclosed.getKind().equals(ElementKind.CLASS)) {
//This next bit doesn't compile.
//I'm looking for the same functionality.
if (expected.isAssignableFrom(enclosed)) {
found = true;
break;
}
}
}
if (!found) {
String message = String.format("Classes marked with the Deserializable annotation must contain an inner class with implements the value of the annotation. %s does not contain a class which implements %s.",
element.getSimpleName().toString(),
expected.toString());
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, message);
}
}
}
return true;
}
private TypeMirror getDeserializableValue(Element element) {
...
}
}
如何通过注释处理在可能的反射中实现与 Class::isAssignableFrom 类似的功能?
这可以借助 AbstractProcessor 的受保护处理环境来完成。它公开了 TypeUtils 的实现,这是一个实用程序 class,可以启用大量反射功能。
if (processingEnv.getTypeUtils().isAssignable(enclosed.asType(), expected)) {
found = true;
break;
}
我有一个注释,它标记 classes 包含一个内部 class,它实现了一个命名接口。
下面是如何使用此注释的示例:
public interface Implementable {}
@Deserializable(Implementable.class)
public class ImplementableFactory {
public static Implementable getImplementable() {
return new Impl();
}
private class Impl implements Implementable {}
}
这里是注释本身:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public @interface Deserializable {
Class value();
}
我想做一些注释处理来确保这个合同。为此,我创建了一个注释处理器 class:
public class DeserializableProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for(Element element : roundEnv.getElementsAnnotatedWith(Deserializable.class)){
TypeMirror expected = getDeserializableValue(element);
if (expected != null) {
Boolean found = false;
for (Element enclosed : element.getEnclosedElements()) {
if (enclosed.getKind().equals(ElementKind.CLASS)) {
//This next bit doesn't compile.
//I'm looking for the same functionality.
if (expected.isAssignableFrom(enclosed)) {
found = true;
break;
}
}
}
if (!found) {
String message = String.format("Classes marked with the Deserializable annotation must contain an inner class with implements the value of the annotation. %s does not contain a class which implements %s.",
element.getSimpleName().toString(),
expected.toString());
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, message);
}
}
}
return true;
}
private TypeMirror getDeserializableValue(Element element) {
...
}
}
如何通过注释处理在可能的反射中实现与 Class::isAssignableFrom 类似的功能?
这可以借助 AbstractProcessor 的受保护处理环境来完成。它公开了 TypeUtils 的实现,这是一个实用程序 class,可以启用大量反射功能。
if (processingEnv.getTypeUtils().isAssignable(enclosed.asType(), expected)) {
found = true;
break;
}