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…