注解Annotation

注解和注释区分

注释(comment)是给人看的,注解既可以给人看还可以给机器看。

注解定义

1、注解(Annotation)是Java语言的一种特性,用于为程序代码提供元数据(metadata)。它们不直接影响程序代码的执行,而是提供有关代码的额外信息,这些信息可以被编译器、解释器或其他工具用来进行特定的处理。
2、在Java中,注解使用**@符号作为前缀**,并放置在类、方法、变量等程序元素的前面。注解可以带有参数,参数以键值对的形式指定,也可以没有参数。
3、Java提供了一些内置的注解,例如**@Override、@Deprecated、@SuppressWarnings**等。除了内置注解之外,开发人员还可以自定义注解,以满足特定需求。
4、我们可以通过反射机制编程实现对于这些元数据的访问

内置注解

1、@Override:定义在java.lang.Override中的。用于声明打算重写一个方法。
2、@Deprecated:定义在java.lang.Deprecated中,通常用于提醒程序员不鼓励使用这样的元素,通常是因为它很危险或者存在更好的选择。在调用的时候会多一道杠。
3、@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息。
这个注解需要加一些参数才可以使用:
@SuppressWarnings(“all”)
@SuppressWarnings(“unchecked”)
@SuppressWarnings(value={“unchecked”,“deprecation”})…
比如:
在这个test()方法中,如果没有 @SuppressWarnings(“all”)会警告Variable “list” is never used,加了之后就不会提示了。

    @SuppressWarnings("all")
    public void test(){
        List list = new ArrayList();
    }

元注解

**作用:**负责解释其他注解,Java提供了4种标准的meta-annotation类型,他们被用来对其他annotation类型作说明。
四种元注解
@Target:用于描述注解的范围,被描述的注解可以用在什么地方
@Target(value= ElementType.METHOD)中value=也可以是一个数组,表示注解作用目标有多个

class Test{
    @MyAnnotation2
    int age = 0;
    @MyAnnotation
    public void testTarget(){

    }
}
//MyAnnotation注解的作用目标为ElementType里的METHOD类,因此只能用在方法上,用在别的上会报错
@Target(value= ElementType.METHOD)
@interface MyAnnotation{

}
//MyAnnotation2注解的作用目标为ElementType里的FIELD类,因此只能用在字段上,用在别的上会报错
@Target(value= ElementType.FIELD)
@interface MyAnnotation2{

}

比如常用的Ovveride方法中,@Target(ElementType.METHOD)的ElementType就是METHOD,说明作用范围是方法。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Retention:表示注解在代码三个生命周期(SOURCE<CLASS<RUNTIME)哪一个生命周期还有效
比如常用的Ovveride方法中,@Retention(RetentionPolicy.SOURCE)的RetentionPolicy就是SOURCE,说明在源码中有效,但是该注解一旦被编译成字节码文件就失效了SuppressWarnings也是在源码中有效,因为当编程class之后这个镇压警告就失效了

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

@Deprecated 是在RUNTIME即运行时有效。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

@Documented:表示是否将我们的注解生成在javadoc中
@Inherited:说明子类可以继承父类中的该注解

自定义注解举例

声明格式:public @interface 注释名{定义内容}

class Test{
    int age = 0;
    @MyAnnotation(name = "zonda")
    public void test(){

    }
    @MyAnnotation2("zonda")//注解MyAnnotation2中只有一个值value,因此不需要value=“zonda”。
    public void test2(){

    }
}
@Target({ElementType.METHOD,ElementType.TYPE})//只在方法和类上面有效
@Retention(RetentionPolicy.RUNTIME)//只在运行时有效
@Documented//这个元注解一般不用写
@Inherited//这个元注解一般不用写
@interface MyAnnotation{
    String name();//注解参数。参数类型 参数名();
    int age() default 0;//如果设置了默认值,可以不赋值
}

@interface MyAnnotation2{
    String value();
}

通过反射机制读取注解

package Annotation;

import java.lang.annotation.Annotation;

/**
 * @author Zonda
 * @version 1.0
 */
public class TestAnnotation {
    public static void main(String[] args) throws Exception{
        Class<?> aClass = Class.forName("beans.User");
        if (aClass.isAnnotationPresent(Comment.class)) {
            Comment annotation = aClass.getAnnotation(Comment.class);
            System.out.println(annotation.value());
        }

    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值