栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

需要Java中的默认构造函数?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

需要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()
。这是一个如何完成的示例:

  1. 基于名称模式。

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

    return type.getQualifiedName().toString().contains("POJO");
  2. 基于类型声明上存在的注释。例如,所有Java Bean Entity类都应具有非默认构造函数

    return type.getAnnotation(Entity.class) != null;
  3. 基于抽象类或接口。

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

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

  4. [推荐方法]:如果使用的是基本类型接口,建议将注释方法与基本类型接口混合使用。您可以声明一个注释,例如

    MyPlain
    和元注释:
    @Inherited
    。然后,您可以使用该批注对基本类型进行批注,然后所有子类也将继承该批注。然后你的方法就是

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

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

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

requiresDefaultConstructor

处理器将运行的类

对任何给定类的注释处理器调用都取决于

SupportedAnnotationTypes
。如果
SupportedAnnotationTypes
元注释指定了具体的注释,则处理器将仅在包含此类注释的那些类上运行。

如果

SupportedAnnotationTypes
"*"
,则将在所有带注释的类上调用处理器!查看[Javadoc](http://java.sun.com/javase/6/docs/api/javax/annotation/processing/Processor.html#getSupportedAnnotationTypes()),其中指出:

最后,

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

请注意如何

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/595617.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号