JavaSE 2022-08-01

本文详细介绍了JavaSE中的注解和反射技术。注解用于提供编译时和运行时的信息,不参与代码直接执行,而反射则允许在运行时检查和操作类、接口、方法等。文章讲解了注解的语法、内置注解和元注解的概念,并通过实例展示了如何使用反射获取和使用注解信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值