1、什么是注解、注解的作用,以及如何自定义注解和使用注解2、内置注解:Deprecated和Override3、元注解:Target和Retention4、注解中定义属性:怎么定义、默认值、value省略属性名、属性支持的类型、数组属性5、反射注解6、反射在开发中的作用示例
1、什么是注解、注解的作用,以及如何自定义注解和使用注解注解的定义:
注解其实就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相对应的处理
注解Annotation是一种引用数据类型注解的作用:
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析,替代配置文件。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查。自定义注解:
[修饰符列表] @interface 注解类型名{}注解使用:
使用方法:@注解类型名
使用位置:注解可以出现在类上、属性上、方法上、变量上等…注解还可以出现在注解类型上
2、内置注解:Deprecated和Override
Override注解:只能注解方法,编译器会自动检查该方法是否重写了父类的方法
Deprecated注解:表示已废弃、暂时可用,不建议使用
元注解的定义:用来标注“注解类型”的“注解”,称为元注解。Target注解
用来标注“被标注的注解”可以出现在哪些位置上。
@Target(ElementType.METHOD)Retention注解
用来标注“被标注的注解”最终保存在哪里
@Retention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中。
@Retention(RetentionPolicy.CLASS):表示该注解被保存在class文件中。
@Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以被反射机制所读取。
4、注解中定义属性:怎么定义、默认值、value省略属性名、属性支持的类型、数组属性
格式:<数据类型> <数据类型名>() 如:String name()使用default指明默认值:<数据类型> <数据类型名>() default <数据值> 如:String name() default “bob”如果一个注解的属性的名字是value,并且只有一个属性的话,在使用的时候,该属性名可以省略。属性的类型可以是:基本数据类型、 String、Class、枚举类型以及它们的数组形式 5、反射注解
前提:元注释Retention属性设置为RUNTIME判断是否存在某注解:isAnnotationPresent(注解.class);如:c.isAnnotationPresent(MyAnnotaion2.class)获取某注解:getAnnotation(注解.class);如:MyAnnotaion2 at = (MyAnnotaion2)c.getAnnotation(MyAnnotaion2.class)获取该注解中的属性:<注解类型对象>.<属性名()> ;如:myAnnotation.value() 6、反射在开发中的作用示例
自定义注解,表明必须有ID这个属性
package com.javalearn.javase.review.annotation.annotation3;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MustHasIdPropertyAnnotation {
}
自定义异常,当使用自定义注解但是未定义ID属性时抛出该异常
package com.javalearn.javase.review.annotation.annotation3;
public class HasNotIdPropertyException extends RuntimeException{
public HasNotIdPropertyException() {
}
public HasNotIdPropertyException(String s) {
super(s);
}
}
定义使用自定义注解的User类
package com.javalearn.javase.review.annotation.annotation3;
@MustHasIdPropertyAnnotation
public class User {
// int id;
String id;
String name;
String password;
}
编写测试程序进行测试
package com.javalearn.javase.review.annotation.annotation3;
import java.lang.reflect.Field;
public class AnnotationTest {
public static void main(String[] args) {
Class c = null;
try {
c = Class.forName("com.javalearn.javase.review.annotation.annotation3.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (c.isAnnotationPresent(MustHasIdPropertyAnnotation.class)) {
Field[] fields = c.getDeclaredFields();
boolean isOk = false;
for (Field field:fields) {
if ("id".equals(field.getName()) && "int".equals(field.getType().getSimpleName())) {
isOk = true;
break;
}
}
if (!isOk) {
throw new HasNotIdPropertyException("被@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性!");
}
}
}
}
此时运行结果为:
Exception in thread "main" com.javalearn.javase.review.annotation.annotation3.HasNotIdPropertyException: 被@MustHasIdPropertyAnnotation注解标注的类中必须要有一个int类型的id属性! at com.javalearn.javase.review.annotation.annotation3.AnnotationTest.main(AnnotationTest.java:23) Process finished with exit code 1



