1.什么是注解
注解会影响程序的编译和运行,注释是给开发人员看的,注解是给程序看的
注解本身仅仅是标注,没有任何逻辑代码。标识类或者方法需要执行的任务
2.内置注解
@Override
表示重写父类方法
@Deprecated
表示方法废弃,不建议使用。说明方法是危险的或者存在漏洞,但是可以被使用,或者有更好的方式,在idea上会表示为删除线
比如new Date(2021,01,01);
@SuppressWarnings
表示镇压警告,程序有错误时不会警告
3.元注解
负责注解其他的注解
@Target
表示可以在哪些地方使用,使用范围,包含如下:
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
@Retention
表示作用的生命周期,RUNTIME > CLASS > SOURCE,默认是RUNTIME
RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,在class字节码文件中不包含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,在class文件中存在,但JVM将会忽略,运行时无法获得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。A
@Documented
表示是否将注解生成在java文档中
@Inherited
表示该注解是否可以被继承,子类可以继承父类
4.自定义注解
package com.ouyang.demo;
import java.lang.annotation.*;
public class Study02 {
//参数为value是,此处可以省略不写value=,如果是其他参数命名,则必须写,如name参数
@MyAnnotation(value = "清华大学", name = "清华大学")
public void test() {
}
}
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotation {
String value() default "北京大学";
//当参数没有默认值时,此参数必传
String name();
}
什么是反射
优点:
可以实现动态创建对象和编译,体现出很大的灵活性
缺点:
对性能有影响,使用反射基本上是一种解释操作,我们可以告诉jvm,希望做什么并且它满足我们的要求,这类动作总是慢于直接执行相同的操作