注解
注解的概念
注解:注解是一种引用数据类型。是一种约束、一种规范。约束类或方法或属性在指定范围内使用。
概念说的很模糊,很抽象对吧。
首先,我们得分清楚什么是注解什么是注释
注解:给机器看的。@符号开头的,一般置于类或方法或属性上方。
注释:给人看的
注释一共有三种形式:
第一种:双斜杠
//注释内容
第二种:/* */
/*
注释内容
*/
第三种:/** * */ 也叫文档注释,可以输出为文档
/**
* 注释内容
*/
搞清楚两者的却别之后,现在我们就可以继续往下讲了。
注解的使用
-
jdk注解
1. @Deprecated:这个注解表示过时。可以用在构造方法、属性、方法、模块等,表示方法、属性、模块等已经过时,不建议使用。 3. @Override:这个注解表示重写。用在方法上。最常见的就是我们的方法重写了。不信你去看你重写方法的时候方法上面有没有这个注解。
-
自定义注解
步骤:-
创建自定义注解
语法:
public @interface 注解名{
数据类型 属性名();//这是属性不是方法
}
注意:注解的属性看起来很像方法。但是,在注解中这就是属性。 -
给注解打上元注解 :
首先,什么是元注解呢?
元注解实际上就是注解的注解。怎么理解这句话呢?看示例:
@Target:指定你的注解使用范围
例如:@Target({ElementType.TYPE,ElementType.METHOD})表示注解只能使用在类和方法上。
ElementType是一个枚举类,里面保存的就是注解的范围常量。
@Retention(RetentionPolicy.RUNTIME)表示这个注解存储在字节码种,可以通过反射找到注解并输出。
RetentionPolicy枚举中的值只有三个,分别是:- Source :你的注解可以在.java文件(源文件)中找到
- Class :你的注解可以在.class(字节码)文件中
- Runtime :你的注解存在字节码中,通过反射找到注解并输出
-
知道了元注解和自定义注解语法后,我们就可以自己编写属于我们自己的注解了。
这里我们写个示例看看吧:
/**
* 我的注解
*/
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//一个属性时,属性名写value
String value();
}
/**
* 打上注解
*/
@MyAnnotation("hello")
public class Student2 {
// @MyAnnotation("world")
private String name;
@MyAnnotation("ok")
public Student2() {}
@MyAnnotation("method")
public void show() {
}
}
当我们的注解中只有一个属性的时候,我们在添加注解后括号内可以不用写属性的名字,直接给属性赋值就行了。
我们还可以给我们的注解中的属性添加一个默认值:
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//添加默认值
String value() default "张三";//默认值为张三
}
当我们指定了元注解@Retention的值为RetentionPolicy.RUNTIME的时候,我们就可以使用反射来获取注解属性了。
/**
* 自定义注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String username();
String password();
}
/**
* 使用自定义注解
*/
public class MyAnnotationTest {
@MyAnnotation(username ="lisi",password = "123")
public void doSome(){
}
}
/**
* 使用反射获取自定义注解的属性
*/
class AnnotationReflectTest{
public static void main(String[] args) {
//获取MyAnnotationTest的doSome()方法上面的注解信息
Class c = null;
try {
c = Class.forName("annotation6.MyAnnotationTest");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取方法
Method doSomeMethod = null;
try {
doSomeMethod = c.getDeclaredMethod("doSome");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//判断该方法上是否存在这个注解 isAnnotationPresent(注解.class)
if (doSomeMethod.isAnnotationPresent(MyAnnotation.class)){
//获取注解属性 getAnnotation(注解.class)
MyAnnotation myAnnotation = doSomeMethod.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation.username());
System.out.println(myAnnotation.password());
}
}
}
好了,注解类大概就到这里吧。如有错误请指出。喜欢的话劳驾动动您的金手指点个赞。