当前位置: 首页 > article >正文

【JAVA】反射和注解

自由早晚乱余生

目录

一.反射

1.什么是反射

2.获取class对象的三种方式

3.获取构造方法Constructor

4.获取成员变量Field

5.获取成员方法Method

6.反射的作用

二.注解

1.注解怎么使用

2.内置注解

2.1@Override

2.2@Deprecated

3.自定义注解内容

4.属性的类型

5.元注解以及枚举

5.1@Target注解源码

5.2@Retention源码

6.反射获取注解

7.注解在实际开发中的作用


一.反射

1.什么是反射

反射就是从类里面拿东西,扒的干干净净,一点不剩

都是从.class字节码文件中获取的,要先获取class对象

2.获取class对象的三种方式

java中已经定义好一个类叫做Class,用来描述字节码文件的

使用场景

复制全类名

代码实现

这里就是把第二种方法当作锁来传递

3.获取构造方法Constructor

Declared表示可以获取到私有的,不加就是只能获取到公共的

步骤

1.先创建Class的对象

2.通过Class对象去.get方法

后两个是通过传递参数来确定获取哪一个,和构造方法参数保持一致,用类型.class

被反射类的构造方法

3.通过获取的构造方法来创建对象

如果创建默认的无参构造
可以直接用获取到的类去.newInstance

4.获取成员变量Field

被反射类的成员变量

解剖

5.获取成员方法Method

被反射类的成员方法

注意,这里用DeclaredMethods只能获取到本类的方法,父类的获取不到

获取单个传递参数(方法名,类型.class)

解剖

获取方法并运行invoke()

6.反射的作用

1.获取一个类里面所有的信息,获取到了之后,再执行其他业务逻辑

2.****读取配置文件的信息去动态的创建对象和调用方法****

这里介绍一个工具类ResourceBundle用来读取配置文件

静态方法getBundle(String),传入参数是配置文件的名称
返回一个ResourceBundle类对象

成员方法getString(String),传入参数是键
返回键对应值的字符串

配置文件

被反射类构造方法

被反射类成员方法

完整测试类代码

public class Test {
    public static void main(String[] args) throws Exception{
        //通过ResourceBundle的静态方法getBundle来传递配置文件名得到ResourceBundle对象
        ResourceBundle bundle = ResourceBundle.getBundle("prop");
        //通过ResourceBundle对象bundle来传递key获取value
        String classname = bundle.getString("classname");//获取类名
        String methodname = bundle.getString("methodname");//获取方法名


        //通过获取到的value来用反射创建对象
        Class c = Class.forName(classname);

        //获取带参的构造方法并且创建对象
        Constructor con = c.getConstructor(int.class, String.class);
        con.setAccessible(true);
        Student s = (Student)con.newInstance(23, "张三");
        System.out.println(s);//Student{id = 23, name = 张三}

        //利用反射创建对象获取成员方法并且运行
        Method method = c.getMethod(methodname);//这里传递的通过获取到的方法名
        method.setAccessible(true);
        method.invoke(s);//Student study

    }
}

二.注解

1.注解怎么使用

注解是一种引用数据类型,编译之后也是生成xxx.class文件

语法格式

[修饰符列表] @interface 注解类型名{}

注解可以出现在任何地方,包括类,属性,方法,变量等等,注解还可以出现在注解上

2.内置注解
2.1@Override

@Override这个注解只能注解方法
@Override这个注解是给编译器参考的,和运行阶段没有关系
凡是方法上带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器会报错

Override源码

Target注解修饰Override注解
Target注解被称作元注解,属于一个规定位置的注解

method就说明Override只能出现在方法上

Retention元注解,表示注解可以保存在什么地方
source表示Override只出现在源文件里,因为Override只是给编译器看的,编译完成后(.class)就不需要了

之后会对元注解做解释,先了解


2.2@Deprecated

表示已过时,会加一个横线

源代码

3.自定义注解内容

添加属性

如果一个注解当中有属性,那么必须给属性赋值

我们可以给属性添加默认值,添加之后,注解就不需要赋值了

如果只有一个属性名字是value的话,属性名字可以不写,直接赋值

注意:只有一个value属性的时候,属性名才可以省略

4.属性的类型

当属性是数组的时候
如果数组中只有一个元素,大括号可以省略

5.元注解以及枚举

enum枚举,可以理解为一个类,里面含有很多属性
用到的时候用枚举名.属性值

5.1@Target注解源码

其中属性值就是一个枚举类型的数组

ElementType枚举源码(部分)

自定义注解被Target元注解修饰


5.2@Retention源码

表示注解可以保存在什么地方
属性值也是一个枚举,但不是数组,只能有一个

RetentionPolicy枚举源代码

SOURCE表示该注解被保存在java源文件中
CLASS表示该注解被保存在class文件中
RUNTIME表示该注解被保存在class文件中,并且可以被反射机制所读取

自定义注解被Retention元注解修饰

6.反射获取注解

1.定义自定义注解

2.把这个注解写到Test类中的方法上


3.通过反射获取类,再通过类获取方法,通过方法获取注解

这个niubi是默认值,在方法中没有指定,如果指定了,打印的就是指定值

如果修改注解的保存地址

代码报错,找不到注解

所以要用is做判断

7.注解在实际开发中的作用

1.自定义注解

2.自定义异常

3.自定义类添加ID注解

4.test类中完成需求


http://www.kler.cn/a/416901.html

相关文章:

  • 基于R语言森林生态系统结构、功能与稳定性分析与可视化
  • 在oracle下载jdk显示400 Bad Request Request Header Or Cookie Too Large
  • 哈希表算法题
  • 使用Native AOT发布C# dll 提供给C++调用
  • Nginx篇之实现nginx转发兼容HTTP和Websocket两种协议
  • net9 abp vnext 多语言通过数据库动态管理
  • 设计模式----迭代器模式
  • 项目学习:仿b站的视频网站项目06 -视频分类01
  • 文档加密怎么做才安全?
  • flutter in_app_purchase google支付 PG-GEMF-01错误
  • java面向对象知识点: 封装,构造,重载
  • 安装软件显示乱码天正2014安装报错修复
  • SeggisV1.0 遥感影像分割软件【源代码】讲解
  • QT按下两次按钮,保存这期间内变换的QtextEdit控件内的数据
  • 「Mac畅玩鸿蒙与硬件37」UI互动应用篇14 - 随机颜色变化器
  • PDF文件怎么加密?如何给pdf文档加密码保护?(2025全新科普)
  • css使盒子在屏幕的地点固定
  • EasyDSS视频推拉流技术的应用与安防摄像机视频采集参数
  • 数据结构题库9
  • 实时数据开发 | Flink反压机制原因、影响及解决方案
  • 【PyTorch】(基础三)---- 图像读取和展示
  • 关于音频 DSP 的接口种类以及其应用场景介绍
  • 【Spring篇】SpringMVC的常见数据绑定
  • 基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面
  • Gelsight视触觉3D显微系统:独特视触技术助力多用途检测
  • B站狂神说Mybatis+Spring+SpringMVC整合理解(ssm框架整合)