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

图2java之Annotation

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 "赛拉提斯";
}
图1java之Annotation





通过反射取得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

图2java之Annotation

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 "赛拉提斯";
}
图1java之Annotation





通过反射取得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是否可以被继承下来