java之Annotation

简介: 一、系统内建AnnotationAnnotation在JDK1.5之后增加的新特性,这种特性被称为元数据特性,注解即,使用注释的方式加入一些程序的信息java.

一、系统内建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图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 图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是否可以被继承下来

相关文章
|
3月前
|
安全 Java 编译器
Java其他: 什么是Java中的注解(Annotation)?
Java其他: 什么是Java中的注解(Annotation)?
41 0
|
9月前
|
SQL XML SpringCloudAlibaba
Java独有特性:注解(annotation)
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。它本身并不起任何作用,可以说有它没它都不影响程序的正常运行,注解的作用在于**「注解的处理程序」**,注解处理程序通过捕获
116 0
|
1月前
|
Java
【Java】注解(Annotation)
【Java】注解(Annotation)
18 0
|
Java 编译器
Java Annotation Processor(一)
Java Annotation Processor
351 0
|
8月前
|
设计模式 缓存 Java
Java反射(反射与代理设计模式、反射与Annotation、自定义Annotation、反射整合工厂设计模式和代理设计模式)
1.反射与代理设计模式,2.反射与Annotation,3.自定义Annotation,4.Annotation整合工厂设计模式和代理设计模式
44 0
|
8月前
|
安全 Java 编译器
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
1.java中String两种实例化对象2.Annotation注解类 3.继承的多态 4.Object类
81 0
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
|
12月前
|
Java 测试技术 程序员
Java的注解(Annotation)
Java的注解(Annotation)
101 0
|
SQL Java 数据库连接
Java 注解 Annotation自定义实战
Java 注解 Annotation自定义实战
109 0
|
安全 Java 程序员
【Java挠头】可变参、foreach、Annotation等特性
【Java挠头】可变参、foreach、Annotation等特性
|
Java Maven
Java Annotation Processor(二)
Java Annotation Processor
153 0