1. Java中annotation注解
class="java" name="code">
1. @Override注解,表示重写。
public class OverrideTest{
@Override
public String toString(){
return "This is OverrideTest";
}
public static void main(String[] args){
OverrideTest test = new OverrideTest();
System.out.println(test);
}
}
运行结果:
This is OverrideTest
2. @Deprecated注解,表示不建议被使用
public class DeprecatedTest{
@Deprecated
public void doSomething(){
System.out.println("do something!");
}
public static void main(String[] args){
DeprecatedTest test = new DeprecatedTest();
test.doSomething();
Date date = new Date();
System.out.println(date.toLocaleString());
}
}
运行结果:
do something!
2015-7-6 23:07:50
3. @SuppressWarnings({"unchecked", "deprecation"})注解,表示压制警告
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;
public class SuppressWarningsTest{
@SuppressWarnings({"unchecked", "deprecation"})
public static void main(String[] args){
Map map = new TreeMap();
map.put("hello", new Date());
System.out.println(map.get("hello"));
Date date = new Date();
System.out.println(date.toLocaleString());
}
}
运行结果:
Mon Jul 06 23:08:04 CST 2015
2015-7-6 23:08:04
2. 自定义annotation注解
自定义annotation:@interface表示定义一个注解。
用@AnnotationTest引用注解,如果注解中是用value来表示值的话,可以直接使用@AnnotationTest(EnumTest.Welcome) 来表示,否则必须使用完整的valuexxx=valueyyy来表示@AnnotationTest(value2 = EnumTest.Welcome)。
自定义注解:当注解中的属性名为value时,在对其赋值时可以不指定属性的名称而直接写上属性值即可;除了value以外的其他值都需要使用name=value这种赋值方式,即明确指定给谁赋值。
default "hello"是设置其默认值为hello,如果赋值就为所赋的值,否则就是hello。
注解中有几个value值,就必须对几个value值都进行赋值(或者有默认值)。
接口不继承注解。
当我们使用@interface关键字定义一个注解时,该注解隐含地继承了java.lang.annotation.Annotation接口;如果我们定义了一个接口,并且让该接口继承自Annotation,那么我们所定义的接口依然还是接口而不是注解;Annotation本身是接口而不是注解。可以与Enum类比。
public @interface AnnotationTest{
String[] value1() default "hello";
EnumTest value2();
}
enum EnumTest{
Hello, World, Welcome;
}
@AnnotationTest(value2 = EnumTest.Welcome)
public class AnnotationUsage{
@AnnotationTest(value1 = {"world", "ABCD"}, value2 = EnumTest.World)
public void method(){
System.out.println("usage of annotation");
}
public static void main(String[] args){
AnnotationUsage usage = new AnnotationUsage();
usage.method();
}
}
运行结果:
usage of annotation
3. 注解可以修饰注解
Retention类
@Retention(RetentionPolicy.CLASS)
@Retention(RetentionPolicy.RUNTIME)
@Retention(RetentionPolicy.SOURCE)
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation{
String hello() default "shengsiyuan";
String world();
}
MyAnnotation(hello = "beijing", world = "shanghai")
public class MyTest{
@MyAnnotation(hello = "tianjin", world = "shangdi")
@Deprecated
@SuppressWarnings("unchecked")
public void output(){
System.out.println("output something!");
}
}
RetentionPolicy.RUNTIME就可以读取到信息,用反射来读取MyTest.java的注解信息。
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class MyReflection{
public static void main(String[] args) throws Exception{
MyTest myTest = new MyTest();
Class<MyTest> c = MyTest.class;
Method method = c.getMethod("output", new Class[]{});
if(method.isAnnotationPresent(MyAnnotation.class)){
method.invoke(myTest, new Object[]{});
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello + ", " + world);
}
Annotation[] annotations = method.getAnnotations();
for(Annotation annotation : annotations){
System.out.println(annotation.annotationType().getName());
}
}
}
运行结果:
output something!
tianjin, shanghai
test10.MyAnnotation
java.lang.Deprecated
@Target(ElementType.METHOD)表示只能修饰方法
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
public @interface MyTarget{
String value();
}
public class MyTargetTest{
@MyTarget("hello")
public void doSomething(){
System.out.println("hello world");
}
}
@Documented注解 可以在产生帮助文档是将注解加到文档中
import java.lang.annotation.Documented;
@Documented
public @interface DocumentedAnnotation{
String hello();
}
public class DocumentedTest{
@DocumentedAnnotation(hello = "welcome")
public void method(){
System.out.println("hello world");
}
}