java注解学习---@Target({ElementType.PACKAGE})理解和使用(三)
一、使用 @HaHaTargetPackage 注解遇到问题
1、新建一个类,直接在当前包上使用 @HaHaTargetPackage 提示错误信息:
Package annotations must be in file package-info.java
2、直接在当前包下 创建
package-info.java 文件,又会提示错误信息:
Type name is not valid. The type name 'package-info' is not a valid identifier
3、
正确做法:在当前包下,选择 new --- package --- 勾选 Create package-info.java 即可。
二、package-info.java 类示例代码
/**
* description: @HaHaTargetPackage 使用,创建正确的 使用示例。
* @version v1.0
* @author w
* @date 2018年6月17日下午10:49:03
*
*/
@HaHaTargetPackage(version="1.0.1")
package com.haha.study.annotation;
import com.haha.study.annotation.target.HaHaTargetPackage;
class PackageInfo{
public void say(){
System.out.println("hello");
}
}
class PackageInfoGeneric<T extends Throwable>{
private T obj;
public void setObj(T obj) {
this.obj = obj;
}
public void say(){
System.out.println("hello "+obj);
}
}
interface PackageInfoInterface {
void test();
}
class PackageInfoConst {
public static final String MESSAGE="Annotation Study";
}
三、PackageInfoTest 测试【二】 示例代码
package com.haha.study.annotation;
import com.haha.study.annotation.target.HaHaTargetPackage;
/**
* description: 用于测试 package-info.java 文件 <br>
* 1、为标注在包上的注解,提供便利;<br>
* 2、声明包的私有类和常量
* @version v1.0
* @author w
* @date 2018年6月17日下午11:16:33
*
*/
public class PackageInfoTest {
public static void main(String[] args) {
// 1、 获取 @HaHaTargetPackage 包注解的版本号
Package packageInfo = Package.getPackage("com.haha.study.annotation");
if(packageInfo !=null && packageInfo.isAnnotationPresent(HaHaTargetPackage.class)){
HaHaTargetPackage annotation = packageInfo.getAnnotation(HaHaTargetPackage.class);
String version = annotation.version();
System.out.println("version: "+version);
}
// 2、 运行 PackageInfo 类
PackageInfo info = new PackageInfo();
info.say();
// 2、1 运行 PackageInfoGeneric 类
PackageInfoGeneric<Exception> infoGeneric = new PackageInfoGeneric<Exception>();
infoGeneric.setObj(new RuntimeException(" 运行异常了。。。 "));
infoGeneric.say();
// 3、运行 PackageInfoInterface 接口
Sub sub =new Sub();
sub.test();
// 4、PackgeInfoConst 常量使用
System.out.println("message :"+PackageInfoConst.MESSAGE);
}
}
class Sub implements PackageInfoInterface {
@Override
public void test() {
System.out.println("class sub running...");
}
}
四、总结
1、package-info.java 类的作用:
- 提供包级别的类(或接口),这些类(或接口)只有本包里才能访问,即使是子包也不能访
问。
- 提供包的整体注释说明。
2、注意点: package-info.java 文件里,不能声明 public class 或 public interface 。
3、@HaHaTargetPackage 注解定义: java注解学习:自定义注解(二)