一、概念
j2se 提供了很多新特性。其中一个很重要的特性就是对元数据(Metadata)的支持。在j2se 5.0 中,这种数据被称为注释(Annontation).通过使用注释,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充的信息。
Annontation 可以用来修饰类、属性、方法,而且Annontation 不影响程序运行,无论是否使用Annontation 代码都可以正常运行。
Java.lang.annontation.Annontation 是Annontation 的接口,只要是Annontation 都必须实现此接口。此接口定义如下:
public interface Annontation{ public Class<? extends Annontation> annotationType(); public boolean equals(Object obj) ; public int hashCode(); String toString(); }
package com.zsc.annon; public class OverrideAnnontationTest { public static void main(String[] args) { Person per = new Student(); System.out.println(per.getInfo()); } } class Person{ public String getInfo(){ return "这是一个Person类"; } } class Student extends Person{ @Override public String getInfo(){ return "这是一个Student类"; } }
package com.zsc.annon; public class OverrideAnnontationTest { public static void main(String[] args) { Person per = new Student(); System.out.println(per.getInfo()); } } class Person{ public String getInfo(){ return "这是一个Person类"; } } class Student extends Person{ @Override public String getiInfo(){ // 提示错误 return "这是一个Student类"; } }
package com.zsc.annon; public class DeprecatedAnnontationTest { public static void main(String[] args) { Person per = new Person(); System.out.println(per.getInfo()); } } class Persons{ @Deprecated public String getInfo(){ return "这是一个Persons类"; } }
package com.zsc.annon; public class SuppressWarningsAnnontationTest { @SuppressWarnings("unchecked") public static void main(String[] args) { Personss per = new Personss(); per.setVar("张三"); System.out.println("内容:"+per.getVar()); } } class Personss<T>{ private T var ; public T getVar(){ return var ; } public void setVar(T var){ this.var = var ; } }
package com.zsc.annon; public @interface AnnontationTest { }
package com.zsc.annon; public @interface MyAnnontation { public String value() ; }
@MyAnnontation("张三") class Demo{ }
@MyAnnontation(value="张三") class Demo{ }
package com.zsc.annon; public @interface MyAnnontation { public String key(); public String value() ; }
@MyAnnontation(value="张三",key="学生") class Demo{ }
package com.zsc.annon; public @interface MyAnnontation { public String[] value(); }
@MyAnnontation(value={"张三","学生"}) class Demo{ }
package com.zsc.annon; public @interface MyAnnontation { public String key() default "学生"; public String value() default "张三"; }
package com.zsc.annon; public class SimpleDemo { @Override @SuppressWarnings(value="unchecked") @Deprecated public String toString(){ return "hello everyone!" ; } }
package com.zsc.annon; import java.lang.annotation.Annotation; import java.lang.reflect.Method; public class ReflactTest { public static void main(String[] args) throws Exception { Class<?> c = null ; c = Class.forName("com.zsc.annon.SimpleDemo"); Method mt = c.getMethod("toString"); Annotation an[] = mt.getAnnotations(); for(Annotation a:an){ System.out.println(a); } } }
@java.lang.Deprecated()
package com.zsc.annon; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(value=RetentionPolicy.RUNTIME) public @interface MyAnnotationReflact { public String key() default "student"; public String value() default "zhangsan"; }
package com.zsc.annon; public class SimpleDemo2 { @Override @Deprecated @SuppressWarnings("unchecked") @MyAnnotationReflact(key="worker",value="lisi") public String toString(){ return "hello word !"; } }
package com.zsc.annon; import java.lang.reflect.Method; public class ReflactTest2 { public static void main(String[] args) throws Exception { Class<?> c = null ; c = Class.forName("com.zsc.annon.SimpleDemo2"); Method mt = c.getMethod("toString"); if(mt.isAnnotationPresent(MyAnnotationReflact.class)){ MyAnnotationReflact mda = null ; mda = mt.getAnnotation(MyAnnotationReflact.class); String key = mda.key(); String value = mda.value(); System.out.println("key:"+key); System.out.println("value:"+value); } } }
key:worker value:lisi