您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第16章:Annotation】_深入Annotation
发布时间:2021-01-08 18:44:16编辑:雪饮阅读()
没有限定annotation范围(类、方法等),则可以在任何地方使用
自定义annotation接口MyAnnotation.java:
package org.kasumi;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
public String key() default "kasumi";
public String value() default "霞";
}
使用该annotation接口的类SimpleBeanOne.java:
package org.kasumi;
@MyAnnotation(key="momiji",value="红叶")
public class SimpleBeanOne{
@MyAnnotation(key="momiji",value="红叶")
public String toString(){
return "hello kasumi";
}
}
获取SimpleBeanOne类的annotation的信息
import org.kasumi.MyAnnotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Hello{
public static void main(String args[]) throws Exception{
Class <?> c=Class.forName("org.kasumi.SimpleBeanOne");
Method tom=c.getMethod("toString");
if(tom.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation mda=tom.getAnnotation(MyAnnotation.class);
String key=mda.key();
String value=mda.value();
System.out.println("key="+key);
System.out.println("value="+value);
}
}
};
用Target限定annotation用于类中的上下文范围
ElementType.TYPE用于限定只能用在类上
MyAnnotation.java限定如:
package org.kasumi;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target(ElementType.TYPE)
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
public String key() default "kasumi";
public String value() default "霞";
}
此时重新编译,SimpleBeanOne类已经编译不过了,因为SimpleBeanOne类中将MyAnnotation同时用在了类和方法上了
D:\>javac -d . MyAnnotation.java
D:\>javac -d . SimpleBeanOne.java
SimpleBeanOne.java:4: 注释类型不适用于该类型的声明
@MyAnnotation(key="momiji",value="红叶")
^
1 错误
ElementType.METHOD用于限定annotation只能用在类上
同时annotation接口使用上下文限定支持多个限定类型
MyAnnotation.java限定如:
package org.kasumi;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
public String key() default "kasumi";
public String value() default "霞";
}
然后这里SimpleBeanOne类代码不需要变动,则全部也能编译过去
D:\>javac -d . MyAnnotation.java
D:\>javac -d . SimpleBeanOne.java
D:\>javac Hello.java
D:\>java Hello
key=momiji
value=红叶
文档型annotation的使用
MyAnnotation.java:
package org.kasumi;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Documented;
@Documented
public @interface MyAnnotation{
public String key() default "kasumi";
public String value() default "霞";
}
SimpleBeanOne.java:
package org.kasumi;
@MyAnnotation(key="momiji",value="红叶")
public class SimpleBeanOne{
/**
*这里是注释
*/
@MyAnnotation(key="momiji",value="红叶")
public String toString(){
return "hello kasumi";
}
}
D:\>javadoc -d mulu SimpleBeanOne.java
正在创建目标目录: "mulu\"
正在装入源文件 SimpleBeanOne.java...
正在构造 Javadoc 信息...
标准 Doclet 版本 1.6.0_11
正在构建所有软件包和类的树...
正在生成 mulu\org/kasumi/\SimpleBeanOne.html...
正在生成 mulu\org/kasumi/\package-frame.html...
正在生成 mulu\org/kasumi/\package-summary.html...
正在生成 mulu\org/kasumi/\package-tree.html...
正在生成 mulu\constant-values.html...
正在构建所有软件包和类的索引...
正在生成 mulu\overview-tree.html...
正在生成 mulu\index-all.html...
正在生成 mulu\deprecated-list.html...
正在构建所有类的索引...
正在生成 mulu\allclasses-frame.html...
正在生成 mulu\allclasses-noframe.html...
正在生成 mulu\index.html...
正在生成 mulu\help-doc.html...
正在生成 mulu\stylesheet.css...
D:\>dir mulu
驱动器 D 中的卷是 软件
卷的序列号是 0592-36B3
D:\mulu 的目录
2021/01/08 18:26 <DIR> .
2021/01/08 18:26 <DIR> ..
2021/01/08 18:26 729 allclasses-frame.html
2021/01/08 18:26 709 allclasses-noframe.html
2021/01/08 18:26 4,807 constant-values.html
2021/01/08 18:26 4,772 deprecated-list.html
2021/01/08 18:26 7,429 help-doc.html
2021/01/08 18:26 5,686 index-all.html
2021/01/08 18:26 1,197 index.html
2021/01/08 18:26 <DIR> org
2021/01/08 18:26 5,019 overview-tree.html
2021/01/08 18:26 12 package-list
2021/01/08 18:26 <DIR> resources
2021/01/08 18:26 1,326 stylesheet.css
10 个文件 31,686 字节
4 个目录 16,526,553,088 可用字节
Inherited的使用
Inherited用于在annotation接口中声明该接口的annotation可以被继承,就是当一个类使用了该annotation接口,则该类的子类也会继承该类所用的annotation的信息
MyAnnotation.java:
package org.kasumi;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
@Documented
@Inherited
@Retention(value=RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
public String name();
}
使用MyAnnotation接口的类SimpleBeanOne.java:
package org.kasumi;
@MyAnnotation(name="红叶")
public class SimpleBeanOne{};
SimpleBeanOne类的子类SimpleBeanTwo中并没有声明任何annotation,SimpleBeanTwo.java:
package org.kasumi;
public class SimpleBeanTwo extends SimpleBeanOne{};
输出获取SimpleBeanTwo子类的annotation信息:
import org.kasumi.MyAnnotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Hello{
public static void main(String args[]) throws Exception{
Class <?> c=Class.forName("org.kasumi.SimpleBeanTwo");
Annotation ann[]=c.getAnnotations();
for(Annotation a:ann){
System.out.println(a);
}
// 继续取得此Annotation设置的内容
if(c.isAnnotationPresent(MyAnnotation.class)){
MyAnnotation mda = null ;
mda = c.getAnnotation(MyAnnotation.class) ;
String name = mda.name() ; // 取出name的内容
System.out.println("name = " + name) ;
}
}
};
D:\>javac -d . MyAnnotation.java
D:\>javac -d . SimpleBeanOne.java
D:\>javac -d . SimpleBeanTwo.java
D:\>javac Hello.java
D:\>java Hello
@org.kasumi.MyAnnotation(name=红叶)
name = 红叶
关键字词:java,Annotation