JavaSE 中 注解和反射技术
注释和注解的区别
注释是给人看的信息,是代码的解释说明,不参与程序执行
注解是给程序看的信息,是代码的解释说明,参与程序运行
注释
注释的语法
// 单行注释
/*
* 多行注释
*/
/**
* 文档注释 (生成项目文档)
*/
注解
注解的语法(可以用在类/接口、属性、方法、参数身上,可以参与编译和执行)
@注解
@Override
重写:运行时多态
用于检查方法是否满足重写的规定
如果满足,则是重写:运行时多态
1.参数列表 类型和个数必须完全相同
2.修饰符 子类>=父类
3.返回值类型 子类<=父类
4.异常类型 子类<=父类
重载:编译时多态
发生在同一个类中
方法名相同,参数列表不同(可以是参数类型不同,也可以是参数个数不同)
与修饰符,返回类型,异常无关
如果不满足,则改方法是子类特有方法
@WebServlet(urlPatterns = "")
@Test
内置注解
jdk 官方给我们提供的注解,我们可以使用,例如@Override
三方库或者中间件给我们提供的注解,我们使用
例如安装 junit 依赖 ,可以使用 @Test @Before @After 注解
例如安装 servlet-api 依赖,可以使用@WebServlet 注解
等等
自定义注解
元注解
注解注解的注解
动词:用一个注解来解释
名称:注解是一种java 源文件
在运行时如何获取注解信息,用到反射技术操作字节码对象
// 要用到反射技术的话必须用到 RUNTIME
反射技术
package chapter18;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Demo02 {
public static void main(String[] args) {
// 字节码对象中有什么东西?
// Class 是一个用于描述字节码的类,它是反射技术的根本
Class clazz = User.class;
// 获取类上的注解 Annotation描述注解的类型
// Annotation[] annotations = c1.getAnnotations();
// System.out.println(annotations.length);//0 @Retention(RetentionPolicy.CLASS)运行时没有获取到
// 获取字节码中类名上的Hello注解,并转为Hello注解类型
Hello hello = (Hello) clazz.getAnnotation(Hello.class);
System.out.println(hello.value());
//获取字节码中的属性的注解
try {
// Field field = clazz.getField("name");
// 暴力获取字节码中的私有属性
Field field = clazz.getDeclaredField("name");
// System.out.println(field);
// 获取属性什么的注解
Hello hello1 = field.getAnnotation(Hello.class);
System.out.println(hello1.value());
// clazz.getMethod("say");
// 获取字节码中的成员方法,什么参数的say方法
Method method = clazz.getMethod("say", String.class);
Hello hello2 = method.getAnnotation(Hello.class);
Parameter[] parameters = method.getParameters();
System.out.println(hello2.value());
System.out.println(parameters.length);
Hello hello3 = parameters[0].getAnnotation(Hello.class);
System.out.println(hello3.value());
Constructor constructor = clazz.getConstructor();
Hello hello4 = (Hello) constructor.getAnnotation(Hello.class);
System.out.println(hello4.value());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}