在Eclipse中, package-info文件不能随便被创建,会报“Type name is notvalid”错误,类名无效,Java变量定义规范是:字母、数字、下划线,还有那个不怎么常用的$符号 一个类是一类或一组事物的描述,比如Dog这个类,就是描述旺财的,那package-info这个类是描述啥的呢?它总要有一个被描述或被陈述的对象,它是描述和记录本包信息。 /**
* package-info不是平常类,其作用有三个:
* 1、为标注在包上Annotation提供便利;
* 2、声明包的私有类和常量;
与package-info相关的问题
在项目开发中,可以放置在包上的常用注解有:Struts的@namespace、Hibernate的@FilterDef和@TypeDef等等。 使用Checkstyle插件做代码检查时,会报一个警告“Missing package-info.java file.”也是这个package-info文件惹的祸,在各个包下创建一个即可。
那么,下面我们一起研究下,到底什么是 package-info.java 类文件~~ 【目录】 1)注解技术 2)package-info类拆解 3)动态ClassLoader原理 与 双亲委派机制 java.lang; @Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { } 二、package-info 的用法: 1)创建一个package:packageinfo 2)创建一个注解:PackageAnotation /** * PackageAnotation.java 定义修饰包的注解 * package-info PackageAnotation { public String version() default ""; } 3)创建一个类,类名 = package-info.java /** * package-info
查看类的文档,如图所示: ◆ 三、创建package-info文件 package-info文件不能随便被创建,会报“This is not a valid Java qualified name”错误
String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info "); } }); } 可以看出在最后排除了 package-info 的 class 类。
//secoo-android.github.io/coobox/library/ https://github.com/secoo-android/coobox/tree/main/library/package-info
package-info.java
/**
* package-info不是平常类,其作用有三个:
* 1、为标注在包上Annotation提供便利;
Spring包扫码 + 依赖注入、AOP注解切面、yml配置映射、拦截器 Java8 接口与default实现、静态方法、枚举、定时器、异常类、泛型、反射、IO流、自定义注解、Lambda表达式、函数式编程 package-info
className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info
MetadataReaderFactory metadataReaderFactory) throws IOException { return true; } }); } // 不包含以package-info String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info
要为指定包创建源文件,可以用 name 作为包名称,后跟 ".package-info";要为未指定的包创建源文件,可以使用 "package-info"。 要为指定包创建类文件,可以用 name 作为包名称,后跟 ".package-info";为未指定的包创建类文件不受支持。
metadataReaderFactory) -> true); } // exclude package-info.java // 4.添加默认的excludeFilters,排除以package-info String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info "); }); } 通常我们都不会指定 annotationClass 和 markerInterface,也就是会添加默认的 Filter,相当于会接受除了 package-info 结尾的所有类
synchronizepkg, pkgs, pkg-list, pkgs-list, package, package-list, packages, packages-list, pkg-info, pkgs-info, package-info
acceptAllInterfaces) { addIncludeFilter((metadataReader, metadataReaderFactory) -> true); } // 排除package-info String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info
非预期结果基本类型不要让四舍五入亏了一方提防包装类型的null值谨慎包装类型的大小比较类、对象及方法在接口中不要存在实现代码构造函数尽量简化使用静态内部类提高封装性让工具类不可实例化覆写equals方法时不要识别不出自己推荐覆写toString方法使用package-info 并且在构造函数中抛出Error错误异常 覆写equals方法时不要识别不出自己 需要满足p.equals(p)返回为真,自反性 推荐覆写toString方法 原始toString方法显示不人性化 使用package-info 类为包服务 package-info类是专门为本包服务的,是一个特殊性主要体现在3个方面:1、它不能随便被创建;2、它服务的对象很特殊;3、package-info类不能有实现代码;package-info
String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info
acceptAllInterfaces) { addIncludeFilter((metadataReader, metadataReaderFactory) -> true); } // 排除package-info String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info
className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info
例外:package-info.java,该文件中可没有package-info类。 3.4.2 类成员顺序 类的成员顺序对易学性有很大的影响,但这也不存在唯一的通用法则。 例外:package-info.java,该文件中可没有package-info类。 3.4.2 类成员顺序 类的成员顺序对易学性有很大的影响,但这也不存在唯一的通用法则。
要启用查询方法的nullability约束的运行时检查,您需要在package-info中使用Spring 的@NonNullApi来激活package-info.java上的非空配置,如下面的示例所示
String className = metadataReader.getClassMetadata().getClassName(); return className.endsWith("package-info