Java注解学习三:package-info.java的使用

时间:2024-03-20 22:15:34

一.引入 

     上文http://zy19982004.iteye.com/blog/1979208中,提到了注解类JyzTargetPackage可以定义为@Target(ElementType.PACKAGE),可是在被注解类里我无论怎么加,编译器都报错,于是引入了package-info.java这个文件。

 

二.创建package-info.java

  1. "I found that when you create a new package in eclispe there is a check box to check if you want a package-info.java."勾上就行了。Java注解学习三:package-info.java的使用
  2. 如果不幸的是你已经创建了这个包并在里面定义了很多类,而eclispe又是不能直接创建一个package-info.java文件的。只能在包对应文件夹里,手动创建一个package-info.java,写上包名,最后刷新eclispe即可。

 

三.package-info.java的作用

 

  1. "Package annotations must be in file package-info.java",package-info.java为我们提供了包注解的地方。JyzTargetPackage(http://zy19982004.iteye.com/blog/1979208)苦苦寻找终于找到地方了。
  2. 提供包级别的类(或接口),这些类(或接口)只有本包里才能访问,即使是子包也不能访问。
  3. 提供包的整体注释说明。Java注解学习三:package-info.java的使用

 package-info.java

/**  
 * <b>package-info不是平常类,其作用有三个:</b><br>  
 * 1、为标注在包上Annotation提供便利;<br>  
 * 2、声明包的私有类和常量;<br>  
 * 3、提供包的整体注释说明。<br>  
 * 
 * @author [email protected] 
*/ 
@JyzTargetPackage(version="1.0")
package com.jyz.study.jdk.annotation;

class PackageInfo{
	public void common(){
		System.out.println("sa");
	}
}

class PackageInfoGeneric<T extends Throwable>{
	private T obj;
	public void set(T obj){
		this.obj = obj;
	}
	public void common(){
		System.out.println(obj + "sa");
	}
}

interface packageInfoInteger{
	public void test();
}

class PackageConstants{
	public static final String ERROE_CODE = "100001";   
}

 

 

TestPackageInfo.java

package com.jyz.study.jdk.annotation;

import java.io.IOException;

/**
 * 测试package-info.java文件的作用
 * 1、为标注在包上Annotation提供便利;<br>  
 * 2、声明包的私有类和常量;<br>  
 * @author [email protected]
 *
 */
public class TestPackageInfo {

	public static void main(String[] args) {
		//1
		Package p = Package.getPackage("com.jyz.study.jdk.annotation");
	    if(p != null && p.isAnnotationPresent(JyzTargetPackage.class)){
	    	JyzTargetPackage nav = p.getAnnotation(JyzTargetPackage.class);
	    	if(nav != null){ 
	    		System.out.println("package version:" + nav.version());
	    	}
	    }
	    
	    //2
		PackageInfo packageInfo = new PackageInfo();
		packageInfo.common();
		
		//泛型也能很好的工作,在pakcage-info.java里定义的类和普通类没什么区别
		PackageInfoGeneric<Exception> packageInfoGeneric = new PackageInfoGeneric<Exception>();
		packageInfoGeneric.set(new IOException("device io"));
		packageInfoGeneric.common();
		
		
		Sub sub = new Sub();
		sub.test();
		
		System.out.println(PackageConstants.ERROE_CODE);
	}
}

class Sub implements packageInfoInteger{
	
	@Override
	public void test() {
		System.out.println("sub");
	}
	
}


console output:
package version:1.0
sa
java.io.IOException: device iosa
sub
100001

 

  需要注意两点

  1. package-info.java里不能声明public class(或 interface)
  2. 刚开始p.isAnnotationPresent(JyzTargetPackage.class)返回false,后来找到原因JyzTargetPackage没有加上@Retention(RetentionPolicy.RUNTIME)。