Java注解初识

Java的注解主要在包java.lang.annotation中实现。

一、JDK注解

1、@override  覆盖父类的一个方法

2、@Deprecated 表示这个方法已经过时

3、@SuppressWarnings("")  忽略警告  代码看起来比较干净

二、常见第三方注解

Spring------->   @Autowired   @Service  @Repository

Mybatis -------->   @InsertProvider   @UpdateProvider   @Options

三、自定义注解

3.1. 元注解

什么是元注解?你可以这样理解,元注解是自定义注解的注解。元注解主要包含4个。他们主要在java.lang.annotation中可以找到。我们自己要创建注解的时候必须要用到这些元注解。所以必须彻底理解这四个元注解的含义。

1>. @Documented

2>. @Inherited

3>. @Retention

4>. @Target


1. @Documented

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

2. @Inherited

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

3. @Target
@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。

ElementType.CONSTRUCTOR  作用于构造器
ElementType.FIELD  作用于域/属性
ElementType.LOCAL_VARIABLE  用于描述局部变量
ElementType.METHOD  作用于方法
ElementType.PACKAGE   用于描述包
ElementType.PARAMETER   用于描述参数
ElementType.TYPE   用于描述类、接口(包括注解类型) 或enum声明,最常用单个修饰对象的范围:

4. Retention

定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

RetentionPolicy.RUNTIME 注解会在class字节码文件中存在,在运行时可以通过反射获取到

RetentionPolicy.CLASS 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

RetentionPolicy.SOURCE 注解仅存在于源码中,在class字节码文件中不包含

3.2、小实例

1>、创建自定义注解----作用于类,方法

注解类
package com.zfx.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * 定义一个用户名的自定义注解
 * @author zfx
 * @date 2016-8-13
 * */
@Documented // 文档
@Retention(RetentionPolicy.RUNTIME)//在运行时可以获取
@Target({ElementType.TYPE,ElementType.METHOD})//作用到类,方法,接口上等
@Inherited //子类会继承
public @interface UserNameAnnotation {
   String value ();//使用的时候 @UserNameAnnotation(value="xxx")
}

注解测试
package com.zfx.annotation;

/**
 * 用户名注解的测试
 * @author zfx
 * @date 2016-8-13
 * */
//注入注解作用在类上面
//可以通过反射获取类的信息后 获取提到这个注解的值
@UserNameAnnotation(value = "I am zfx!")
public class Demo1 {
String userName;

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;

}

//注入注解作用在方法上面
//可以通过反射获取类的信息后 获取提到这个注解的值

@UserNameAnnotation(value = "I am a good kid!")
public void say(){  }
}
测试类
package com.zfx.annotation;

public class ClassTest {

public static void main(String[] args) {
try {
//1.使用类加载器加载注解
Class c = Class.forName("com.zfx.annotation.Demo1");
//2.找到类上面的注解
boolean isExit = c.isAnnotationPresent(UserNameAnnotation.class);
if(isExit){
//3.拿到注解实例
UserNameAnnotation u = (UserNameAnnotation)c.getAnnotation(UserNameAnnotation.class);
System.out.println(u.value());

}

//4.找到方法上的注解
Method[] ms = c.getMethods();
for(Method m : ms){
boolean isMExit = m.isAnnotationPresent(UserNameAnnotation.class);
if(isMExit){
UserNameAnnotation um = (UserNameAnnotation)m.getAnnotation(UserNameAnnotation.class);
System.out.println(um.value());
}
}

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出

I am zfx!

I am a good kid!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值