java之Annotation
一、系统内建Annotation
Annotation在JDK1.5之后增加的新特性,这种特性被称为元数据特性,注解即,使用注释的方式加入一些程序的信息
java.lang.annotation .Annotation接口是所有的Annotation都必须实现的接口
1、@Override:覆写的Annotation
2、@Deprecated:不赞成使用的Annotation
3、@SuppressWarnings:压制安全警告的Annotation
@override表示覆写方法的正确性,例如有下面的代码:
package com.java.annotation;
class Person {
public String getInfo() {
return "这是一 个p类";
}
}
class Student extends Person {
// @Override
public String get() {// 覆写方法
return "这是一个学生类";
}
}
public class demo01 {
public static void main(String[] args) {
Person person = new Student();
System.out.println(person.getInfo());
}
}
如果不小心将覆写方法getInfo写错了,则@OVERRIDE会提示报错
@Deprecated
可以在类或者方法上使用,编译会产生提示信息
package com.java.annotation;
class Person1 {
@Deprecated
public String getInfo() {
return "这是一 个p类";
}
}
public class Deprecateddemo02 {
public static void main(String[] args) {
Person1 person1 = new Person1();
System.out.println(person1.getInfo());
}
}
@SuppressWarnings
压制警告信息
package com.java.annotation;
class Demo<T> {
private T var;
public T getVar() {
return this.var;
}
public void setVar(T var) {
this.var = var;
}
}
public class SuppressWarningsDemo03 {
@SuppressWarnings({ "rawtypes", "unchecked" })//数组的形式添加压制的警告信息
public static void main(String[] args) {
Demo d = new Demo();
d.setVar("帆赛提斯");
System.out.println("内容:" + d.getVar());
}
}
二、自定义的Annotation
Annoation定义格式:
[public]@interface Annotation 名称{
数据类型 变量名称();
}
例1:单个参数
public @interface MyAnnotationSigngleParam {
public String value();
}
例2:
package com.java.annotation;
public @interface MyAnnotationMoreParam {
public String key();
public String value();
}
例3:设置两个参数,一个是key,另一个是value
package com.java.annotation;
public @interface MyAnnotationArrayParam {
public String[] value();
}
例4:接受一个数组类型,要传递数组,
package com.java.annotation;
public @interface MyAnnotationArrayParam {
public String[] value();
}
例5:前几个参数内容需要在使用注释 的时候写上去,那么,可以为参数设置一个默认的内容,在声明时使用default即可,
package com.java.annotation;
public @interface MyAnnotationDefaultValue {
public String key() default "mdl";
public String vlaue() default "李兴华";
}
实例:
package com.java.annotation;
@MyAnnotationSigngleParam(value = "李兴华")
@MyAnnotationMoreParam(key = "mdl", value = "李新华")
@MyAnnotationEnum(name = MyName.lxh)
public class MyAnnotation {
public static void main(String[] args) {
System.out.println("李兴华");
}
}
例6:同样可以指定枚举类型
package com.java.annotation;
public enum MyName {
lxh, wb, tmac;
}
package com.java.annotation;
public @interface MyAnnotationEnum {
public MyName name() default MyName.lxh;// 指定默认值
}
Retention和RetentionPolicy
图2
package com.java.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotationRetention {
public String name() default "赛拉提斯";
}
图1通过反射取得Annotation
程序:
package com.java.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class ReflectDemo01 {
public static void main(String[] args) throws Exception {
Class<?> c = null;
c = Class.forName("com.java.annotation.SingleBeanTwo");
Method toM = c.getMethod("toString");
Annotation[] an = toM.getAnnotations();
if (toM.isAnnotationPresent(MyAnnotationReflect.class)) {// 判断指定的Annotation
MyAnnotationReflect mda = null;
mda = toM.getAnnotation(MyAnnotationReflect.class);
String key = mda.key();// 取出设置key
String value = mda.value();// 取出设置的value
System.out.println("key=" + key);
System.out.println("value=" + value);
}
for (Annotation a : an) {// 使用foreach输出
System.out.println(a);
}
}
}
深入理解Annotation:
之前Annotation没有说明在什么地方使用,现在建一个Annotation只能在类上使用,类型是TYPE,
如果设置在方法上则类型添加METHOD
package com.java.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.TYPE, ElementType.METHOD })
// 此注释只能用类上
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotationTarget {
public String key() default "lxh";
public String value() default "李兴华";
}
@Documented,可以用在任何Annotation上使用,所有Annotation默认情况下使用@Documented进行注释,而且生成javadoc的时候可以通过@Documented设置一些说明信息。
@Inherited,注释,此注释表示一个Annotation是否可以被继承下来
一、系统内建Annotation
Annotation在JDK1.5之后增加的新特性,这种特性被称为元数据特性,注解即,使用注释的方式加入一些程序的信息
java.lang.annotation .Annotation接口是所有的Annotation都必须实现的接口
1、@Override:覆写的Annotation
2、@Deprecated:不赞成使用的Annotation
3、@SuppressWarnings:压制安全警告的Annotation
@override表示覆写方法的正确性,例如有下面的代码:
package com.java.annotation;
class Person {
public String getInfo() {
return "这是一 个p类";
}
}
class Student extends Person {
// @Override
public String get() {// 覆写方法
return "这是一个学生类";
}
}
public class demo01 {
public static void main(String[] args) {
Person person = new Student();
System.out.println(person.getInfo());
}
}
如果不小心将覆写方法getInfo写错了,则@OVERRIDE会提示报错
@Deprecated
可以在类或者方法上使用,编译会产生提示信息
package com.java.annotation;
class Person1 {
@Deprecated
public String getInfo() {
return "这是一 个p类";
}
}
public class Deprecateddemo02 {
public static void main(String[] args) {
Person1 person1 = new Person1();
System.out.println(person1.getInfo());
}
}
@SuppressWarnings
压制警告信息
package com.java.annotation;
class Demo<T> {
private T var;
public T getVar() {
return this.var;
}
public void setVar(T var) {
this.var = var;
}
}
public class SuppressWarningsDemo03 {
@SuppressWarnings({ "rawtypes", "unchecked" })//数组的形式添加压制的警告信息
public static void main(String[] args) {
Demo d = new Demo();
d.setVar("帆赛提斯");
System.out.println("内容:" + d.getVar());
}
}
二、自定义的Annotation
Annoation定义格式:
[public]@interface Annotation 名称{
数据类型 变量名称();
}
例1:单个参数
public @interface MyAnnotationSigngleParam {
public String value();
}
例2:
package com.java.annotation;
public @interface MyAnnotationMoreParam {
public String key();
public String value();
}
例3:设置两个参数,一个是key,另一个是value
package com.java.annotation;
public @interface MyAnnotationArrayParam {
public String[] value();
}
例4:接受一个数组类型,要传递数组,
package com.java.annotation;
public @interface MyAnnotationArrayParam {
public String[] value();
}
例5:前几个参数内容需要在使用注释 的时候写上去,那么,可以为参数设置一个默认的内容,在声明时使用default即可,
package com.java.annotation;
public @interface MyAnnotationDefaultValue {
public String key() default "mdl";
public String vlaue() default "李兴华";
}
实例:
package com.java.annotation;
@MyAnnotationSigngleParam(value = "李兴华")
@MyAnnotationMoreParam(key = "mdl", value = "李新华")
@MyAnnotationEnum(name = MyName.lxh)
public class MyAnnotation {
public static void main(String[] args) {
System.out.println("李兴华");
}
}
例6:同样可以指定枚举类型
package com.java.annotation;
public enum MyName {
lxh, wb, tmac;
}
package com.java.annotation;
public @interface MyAnnotationEnum {
public MyName name() default MyName.lxh;// 指定默认值
}
Retention和RetentionPolicy
图2
package com.java.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotationRetention {
public String name() default "赛拉提斯";
}
图1通过反射取得Annotation
程序:
package com.java.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class ReflectDemo01 {
public static void main(String[] args) throws Exception {
Class<?> c = null;
c = Class.forName("com.java.annotation.SingleBeanTwo");
Method toM = c.getMethod("toString");
Annotation[] an = toM.getAnnotations();
if (toM.isAnnotationPresent(MyAnnotationReflect.class)) {// 判断指定的Annotation
MyAnnotationReflect mda = null;
mda = toM.getAnnotation(MyAnnotationReflect.class);
String key = mda.key();// 取出设置key
String value = mda.value();// 取出设置的value
System.out.println("key=" + key);
System.out.println("value=" + value);
}
for (Annotation a : an) {// 使用foreach输出
System.out.println(a);
}
}
}
深入理解Annotation:
之前Annotation没有说明在什么地方使用,现在建一个Annotation只能在类上使用,类型是TYPE,
如果设置在方法上则类型添加METHOD
package com.java.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.TYPE, ElementType.METHOD })
// 此注释只能用类上
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotationTarget {
public String key() default "lxh";
public String value() default "李兴华";
}
@Documented,可以用在任何Annotation上使用,所有Annotation默认情况下使用@Documented进行注释,而且生成javadoc的时候可以通过@Documented设置一些说明信息。
@Inherited,注释,此注释表示一个Annotation是否可以被继承下来