Java-注解

422 阅读4分钟

JDK内置的三个基本注解

@Override: 限定重写父类方法, 实现接口方法。该注解只能用于方法

@Deprecated: 用于表示所修饰的元素(类, 方法,构造器等等)已过时。通常是因为所修饰的结构危险或存在更好的选择,过时是可以用的,意义只是作为一种提示,因为原来的项目中用的老的代码必须要能用,过时是给我们后面做开发的提示

@SuppressWarnings: 抑制编译器警告

警告信息在eclipse中更明显一些

比如在eclipse的main中:inti=10; 但程序中没有用到i,在这一行左边就会出现黄颜色的感叹号警告

但如果在这一行或者main方法上面的那一行加了@SuppressWarnings(“unused”),警告就没有了。这个注解的值叫做unused,在IDEA中没有黄颜色的感叹号警告,如果变量没有使用,变量的颜色是灰色的。 在定义变量的那一行上方加上@SuppressWarnings(“unused”),变量也就变成黑色了 比如在eclipse中,如果声明ArrayList没有用泛型,list没有用都会有警告,可以在上面加上@SuppressWarnings({“unused”,“rawtypes”}),警告就没有了。

class Person{
    private String name;
    private int age;

    public Person() {

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void walk(){
        System.out.println("人走路");
    }

    public void eat(){
        System.out.println("人吃饭");
    }


}
interface Info{
    void show();
}


class Student extends Person implements Info{

    //Override就是注解,是在编译的过程中校验这个方法是不是重写父类的方法。实现接口中的方法也是Override
    //如果把 @Override去掉,下面的方法还是重写了父类的方法,只是在编译时不会进行校验方法是不是重写
    //只有方法上面才能用 @Override
    @Override
    public void walk() {//快速写法,walk+enter
        System.out.println("学生走路");
    }


    @SuppressWarnings({"unused","rawtypes"})//点开它的结构,有点像类,可以往里面写多个值是因为里面有一个数组结构String[] value();
    ArrayList list=new ArrayList();//注解是可以写多个值的,这些值就看做这个结构的成员变量


    //接口,类可以有成员变量,只不过接口的是常量,不是变量
    @Override
    public void show() {//如果把show改成show1就会报错,因为加了Override注解,在编译的时候就会进行校验,要求方法一定是重写父类或者是实现接口的方法


    }
}

自定义注解

@Target:

表示该注解可以用于什么地方,可能的ElementType参数有:

  • CONSTRUCTOR:构造器的声明
  • FIELD:域声明(包括enum实例)
  • LOCAL_VARIABLE:局部变量声明
  • METHOD:方法声明
  • PACKAGE:包声明
  • PARAMETER:参数声明
  • TYPE:类、接口(包括注解类型)或enum声明

@Retention

表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:

  • SOURCE:注解将被编译器丢弃
  • CLASS:注解在class文件中可用,但会被VM丢弃
  • RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息

@Document

将注解包含在Javadoc中

@Inherited

允许子类继承父类中的注解

下面我们自己来新建一个注解。在我们开发中。经常会使用自己设置的注解

首先我们创建一个注解类

复制代码

package com.java.api;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**定义注解
 * @Target:

表示该注解可以用于什么地方,可能的ElementType参数有:
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
@Retention

表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:
SOURCE:注解将被编译器丢弃
CLASS:注解在class文件中可用,但会被VM丢弃
RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
 * 
 * */
public class UseCase{
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCases{
    public String id();
    public String description() default "no description";
}
}

然后使用注解

package com.java.api;

import com.java.api.UseCase.UseCases;

/**
 * 使用注解:
 * 
 * */
public class PasswordUtils {
    @UseCases(id="47",description="Passwords must contain at least one numeric")
     public boolean validatePassword(String password) {
         return (password.matches("\\w*\\d\\w*"));
     }

     @UseCases(id ="48")
     public String encryptPassword(String password) {
         return new StringBuilder(password).reverse().toString();
     }
}

最后我们来测试我们写的注解:

package com.java.api;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.java.api.UseCase.UseCases;

/**
 *解析注解:
 * 
 * */
public class UserCaseTest {
public static void main(String[] args) {
     List<Integer> useCases = new ArrayList<Integer>();
     Collections.addAll(useCases, 47, 48, 49, 50);
     trackUseCases(useCases, PasswordUtils.class);
}
public static void trackUseCases(List<Integer> useCases, Class<?> cl) {
    for (Method m : cl.getDeclaredMethods()) {
        //获得注解的对象
        UseCases uc = m.getAnnotation(UseCases.class);
        if (uc != null) {
            System.out.println("Found Use Case:" + uc.id() + " "
                        + uc.description());
            useCases.remove(new Integer(uc.id()));
        }
    }
    for (int i : useCases) {
        System.out.println("Warning: Missing use case-" + i);
    }
}
}

总结:

  • java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。

  • 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。包含在 java.lang.annotation 包中

  • java自定义注解和运行时靠反射获取注解。

blog参考:www.cnblogs.com/huojg-21442…