java 范围注解_Java-----注解

1.什么是注解?

Annotation是JDK5.0开始引入的新技术。

Annotation的作用:

不是程序本身,可以对程序作出解释。(这一点,跟注释没什么区别)

可以被其他程序(比如:编译器)读取。(注解信息处理流程,是注解和注释的重大区别)

Annotation的格式:

--注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SupperssWarnings(value="unchecked")。

Annotation在哪里使用?

--可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些 元数据的访问。

2.内置注解

@Override ----(重写)

定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写父类中的另一个方法声明。

packagejava.lang;import java.lang.annotation.*;

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.SOURCE)public @interfaceOverride {

}

@Deprecated ----(不推荐使用,带有一个中划线)

定义在java.lang.Deprecated中,此注释可用于修辞方法、属性、类,表示不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。

3ab3c3ebf1330cba326021a2d067ff62.png

packagejava.lang;import java.lang.annotation.*;import static java.lang.annotation.ElementType.*;

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})public @interfaceDeprecated {

}

@SuppressWarnings ----(抑制警告)

定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。

45a0cece469158f15f0e2cd7ab5cee03.png

packagejava.lang;import java.lang.annotation.*;import static java.lang.annotation.ElementType.*;

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

@Retention(RetentionPolicy.SOURCE)public @interfaceSuppressWarnings {

String[] value();

}

3.自定义注解

关键字@interface

元注解的作用就是负责注解其他注解。Java定义了4个标准的meta-annotation类型,它们被用来提供对其它annotation类型作说明。

这些类型和它们所支持的类在java.lang.annotation包中可以找到

----@Target

----@Retention

----@Documented

----@Inherited

1.@Target的源码及作用范围

ElementType类型是一个枚举类型,里面都是固定的值

packagejava.lang.annotation;

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceTarget {//参数类型 参数名

ElementType[] value();

}

ElementType:

packagejava.lang.annotation;//枚举

public enumElementType {

TYPE,

FIELD,

METHOD,

PARAMETER,

CONSTRUCTOR,

LOCAL_VARIABLE,

ANNOTATION_TYPE,

PACKAGE,/*** Type parameter declaration

*

*@since1.8*/TYPE_PARAMETER,/*** Use of a type

*

*@since1.8*/TYPE_USE

}

其作用是给自定义的注解,描述它能加到什么地方。

93d85eb20715e9258cead33cc7b22cb2.png

2.@Retention的源码及作用范围

注解保留策略(RetentionPolicy)

packagejava.lang.annotation;

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)public @interfaceRetention {//也是一个枚举类型 参数名

RetentionPolicy value();

}

RetentionPolicy:

packagejava.lang.annotation;//枚举

public enumRetentionPolicy {

SOURCE,

CLASS,

RUNTIME

}

1f73cdd749883b01ab5c520a4007f9b0.png

示例:

自定义的注解:

importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;//这就表示自定义注解只能用在方法上和类上

@Target(value = {ElementType.METHOD,ElementType.TYPE})//可以写到数组中

@Retention(value = RetentionPolicy.RUNTIME)//表示注解在运行时有效,可被反射(运行时)读取到

public @interfaceMyAnnotation {//写内容//参数类型 参数名 默认值

public String name() default "";//加了默认值 ""

public int age() default 0;//表示不存在

int id() default -1;//int indexOf("abc") 返回子字符在字符串中第一次出现的索引,如果没有的话,返回-1,也就是表示不存在

String[] schools()default {"清华大学","北京大学"};

}

packagecom.xjs.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;

@Target(value={ElementType.METHOD,ElementType.TYPE})

@Retention(value=RetentionPolicy.RUNTIME)public @interfaceXJSAnnotation {

String value();

}

使用:

importcom.xjs.annotation.XJSAnnotation;public classDemo2 {

@MyAnnotation(age=18,name="金泰妍")public voidtest() {

}

@XJSAnnotation("taeyeon")public voidtest2() {

}

}

06ec55b0e2ff9743182c9792bcce07a6.png

例子:

1.注解的解析完全依赖于反射。

2.不要滥用注解,平常我们编程过程很少接触和使用注解,只有做设计,且不想让设计有过多的配置时。

Student.java:

packagecom.xjs.annotation;//使用注解,使这个类和表对应

@XJSTable(value = "tb_student")public classStudent {

@XJSField(columnName= "id", length = 10, type = "int")private intid;

@XJSField(columnName= "sname", length = 10, type = "varcher")privateString name;

@XJSField(columnName= "age", length = 3, type = "int")private intage;publicStudent() {super();//TODO Auto-generated constructor stub

}public Student(int id, String name, intage) {super();this.id =id;this.name =name;this.age =age;

}public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";

}

}

自定义注解XJSTable.java:

packagecom.xjs.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;

@Target(value={ElementType.TYPE})

@Retention(value=RetentionPolicy.RUNTIME)//自定义注解

public @interfaceXJSTable {

String value();

}

自定义注解XJSField.java:

packagecom.xjs.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;

@Target(value= {ElementType.FIELD})//加在属性上

@Retention(value =RetentionPolicy.RUNTIME)public @interfaceXJSField {

String columnName();//列名

String type();//类型

int length();//长度

}

利用反射机制解析该类上加的注解Demo3.java:

packagecom.xjs.annotation;importjava.lang.annotation.Annotation;importjava.lang.reflect.Field;/*** 使用反射读取注解的信息,模拟处理注解信息的流程

*@authorhp

**/

public classDemo3 {public static voidmain(String[] args) {try{

Class clazz= Class.forName("com.xjs.annotation.Student");

Annotation[] annotations= clazz.getDeclaredAnnotations();//获得这个类的所有注解

for(Annotation annotation : annotations) {

System.out.println(annotation);

}//获得类指定的注解

XJSTable xt= (XJSTable) clazz.getDeclaredAnnotation(XJSTable.class);

System.out.println(xt.value());//获取这个类上的注解的value值//获得类的属性的注解

Field f = clazz.getDeclaredField("name");

XJSField xjsFile= f.getAnnotation(XJSField.class);

System.out.println(xjsFile.length());//根据获得的表名,字段的信息,拼出SQL语句,然后,使用JDBC执行这个SQL,在数据库中生成相关的表的记录

/** 注解--->依赖反射,然后获取信息

* 对象的每一个属性信息---JDBC--->通过SQL语句添加到数据库中对应的字段

**/}catch(Exception e) {

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值