gpt4 book ai didi

Java - 注解处理

转载 作者:行者123 更新时间:2023-11-30 08:43:55 27 4
gpt4 key购买 nike

我有一个注释,用于标记包含实现命名接口(interface)的内部类的类。

这是一个如何使用这个注解的例子:

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();
}

我想做一些注释处理来确保这个契约。为此,我创建了一个注解处理器类:

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 的 protected 处理环境来完成。它公开了 TypeUtils 的实现,这是一个启用大量反射功能的实用程序类。

if (processingEnv.getTypeUtils().isAssignable(enclosed.asType(), expected)) {
found = true;
break;
}

关于Java - 注解处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34010769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com