java 必须存在默认构造器_需要Java中的默认构造函数?

小编典典

您可以为此构建一个注释处理器。注释处理器是在编译时运行的编译器插件。它们的错误显示为编译器错误,甚至可能停止构建。

这是一个示例代码(尽管我没有运行它):

@SupportedAnnotationTypes("*") // needed to run on all classes being compiled

@SupportedSourceVersion(SourceVersion.RELEASE_6)

public class DefaultConstructor extends AbstractProcessor {

@Override

public boolean process(Set extends TypeElement> annotations,

RoundEnvironment roundEnv) {

for (TypeElement type : ElementFilter.typesIn(roundEnv.getRootElements())) {

if (requiresDefaultConstructor(type))

checkForDefaultConstructor(type);

}

return false;

}

private void checkForDefaultConstructor(TypeElement type) {

for (ExecutableElement cons :

ElementFilter.constructorsIn(type.getEnclosedElements())) {

if (cons.getParameters().isEmpty())

return;

}

// Couldn't find any default constructor here

processingEnv.getMessager().printMessage(

Diagnostic.Kind.ERROR, "type is missing a default constructor",

type);

}

private boolean requiresDefaultConstructor(TypeElement type) {

// sample: require any JPA Entity to have a default constructor

return type.getAnnotation(Entity.class)) != null

|| type.getQualifiedName().toString().contains("POJO");

}

}

如果引入注释(例如RequiresDefaultAnnotation),则注释处理器将变得更加容易。

声明具有默认限定符的要求

::我还假设OP要求一种机制来防止开发人员意外错误,尤其是其他人编写的错误。

必须有一种机制来声明哪些类需要默认处理器。希望您已经有了相应的条件,无论是名称中的模式,限定符中的模式,可能的注释和/或基本类型。在上面提供的示例中,您可以在方法中指定条件requiresDefaultConstructor()。这是一个如何完成的示例:

基于名称模式。 TypeElement提供对完全限定名称和程序包名称的访问。

return type.getQualifiedName().toString().contains("POJO");

基于类型声明上存在的注释。例如,所有Java Bean Entity类都应具有非默认构造函数

return type.getAnnotation(Entity.class) != null;

基于抽象类或接口。

TypeElement basetype = processingEnv.getElements().getTypeElement("com.notnoop.mybase");

return processingEnv.getTypes().isSubtype(type.asType(), basetype.asType());

[推荐方法]:如果使用的是基本类型接口,建议将注释方法与基本类型接口混合使用。您可以声明一个注释,例如MyPlain和元注释:@Inherited。然后,您可以使用该批注对基本类型进行批注,然后所有子类也将继承该批注。然后你的方法就是

return type.getAnnotation(MyPlain.class) != null;

如果模式确实基于类型层次结构并且您拥有根类,那么这样做会更好一些,因为它更具可配置性。

如前所述,仅仅因为它被称为“注释处理”,就意味着您必须使用注释!您要遵循列表中的哪种方法取决于您的上下文。基本上,关键是要在部署实施工具中配置的任何逻辑都可以使用requiresDefaultConstructor。

处理器将运行的类

对任何给定类的注释处理器调用都取决于SupportedAnnotationTypes。如果SupportedAnnotationTypes元注释指定了具体的注释,则处理器将仅在包含此类注释的那些类上运行。

最后,"*"它本身代表所有注释类型的集合,包括空集合。请注意,"*"除非处理器实际上正在处理所有文件,否则不应声明。声称不必要的注释可能会导致某些环境下的性能下降。

请注意如何false返回以确保处理器不声明所有注释。

2020-10-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值