java 反射和注解

2023-10-27

1.反射

1.1定义反射:

框架设计的灵魂;什么是框架:是半成品软件,可以在框架的基础上进行软件开发,简化编码;概念:将类的各个组成部分封装成其他对象,这个封装的过程就是反射机制;在运行的过程中,你能够知道任意一个类的所有的属性和方法,这个知道的过程就是反射机制;概念:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。要想 解析一个类,必须先要获取到该类的字节码文件对应的Class类型的对象,而解剖类中的各成分使用的就是Class类中的方法。

1.2java代码的三个阶段

source–>class阶段–》runtime阶段
在这里插入图片描述
1.Class.forName(“全类名”);把字节码文件加载到内存;
2.类名.class 通过类名的class属性获取Class对象
3.对象.getClass() 通过对象的getClass()方法获取Class对象;

在这里插入图片描述
双亲委派模型:https://blog.csdn.net/u013568373/article/details/93995246
1、启动类加载器(Bootstrap ClassLoader),它是属于虚拟机自身的一部分,用C++实现的,主要负责加载<JAVA_HOME>\lib目录中或被-Xbootclasspath指定的路径中的并且文件名是被虚拟机识别的文件。它等于是所有类加载器的爸爸。
2、扩展类加载器(Extension ClassLoader),它是Java实现的,独立于虚拟机,主要负责加载<JAVA_HOME>\lib\ext目录中或被java.ext.dirs系统变量所指定的路径的类库。
3、应用程序类加载器(Application ClassLoader),它是Java实现的,独立于虚拟机。主要负责加载用户类路径(classPath)上的类库,如果我们没有实现自定义的类加载器那这玩意就是我们程序中的默认加载器

在这里插入图片描述
原理:当一个类加载器收到类加载任务时,会先交给自己的父加载器去完成,因此最终加载任务都会传递到最顶层的BootstrapClassLoader,只有当父加载器无法完成加载任务时,才会尝试自己来加载。

具体:根据双亲委派模式,在加载类文件的时候,子类加载器首先将加载请求委托给它的父加载器,父加载器会检测自己是否已经加载过类,如果已经加载则加载过程结束,如果没有加载的话则请求继续向上传递直Bootstrap ClassLoader。如果请求向上委托过程中,如果始终没有检测到该类已经加载,则Bootstrap ClassLoader开始尝试从其对应路劲中加载该类文件,如果失败则由子类加载器继续尝试加载,直至发起加载请求的子加载器为止。

采用双亲委派模式可以保证类型加载的安全性,不管是哪个加载器加载这个类,最终都是委托给顶层的BootstrapClassLoader来加载的,只有父类无法加载自己猜尝试加载,这样就可以保证任何的类加载器最终得到的都是同样一个Object对象。

1.3将类的各个部分封装的对象

在这里插入图片描述

1.4获取
1.4.1获取类名

在这里插入图片描述

1.4.2获取成员变量

在这里插入图片描述
getFields()–>获取所有public修饰的成员变量;

getDeclaredFields()–>不考虑权限修饰符暴力反射概念;

属性.setAccessible(true);

值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查;实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ; // 由于JDK的安全检查耗时较多.所以通过setAccessible(true) 的方式关闭安全检查就可以达到提升反射速度的目的

操作:
获取值:属性.get(对象)
设置值:属性.set(对象,值)

1.4.3获取构造方法

在这里插入图片描述

1.4.4获取成员方法

在这里插入图片描述
操作方法:
invoke(对象,参数);
方法名.invoke(对象)

取消安全检查(暴力反射)
方法名.setAccessible(true)

1.4.5获取注解

在这里插入图片描述

2.注解

2.1概念和作用

注解:说明程序的,给计算机看的;注释:描述程序的,给程序员看的;
作用:

1.用来编写API文档举例:@since @author写一个方法注释使用javadoc生成文档

2.代码分析通过代码里标识的注解可以对代码进行分析,结合反射使用;

3.编译检查通过注解能够实现基本的编译检查;例如@override注解三部分:预定义注解 元注解 自定义注解

2.2预定义注解

@Override :检测被该注解标注的方法是否是继承自父类(接口)的

@Deprecated:该注解标注的内容,表示已过时 举例:方法上标注该注解,然后在另一个方法中去使用,大家看现象;
@SuppressWarnings:压制警告 * 一般传递参数all @SuppressWarnings(“all”),一般写在类上面;

2.3自定义注解定义格式元注解

public @interface 注解名称{
属性列表;
}

定义一个注解然后反编译查看注解的本质

本质

注解的本质就是一个接口,默认继承Annotation接口public interface MyAnno extends java.lang.annotation.Annotation {}

属性
要求如下:

  1. 属性的返回值类型有下列取值,不能是void必须有返回值,因为返回值就是该属性的数据类型,其他的自定义的引用类型也不可以,比如自定义的Book不可以;
    * 基本数据类型
    * String
    * 枚举
    * 注解

以上类型的数组举例

  1. 定义了属性,在使用时需要给属性赋值;属性就是接口中的抽象方法

    1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
    2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
    3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略举例
2.4元注解

Target使用属性ElementType

在这里插入图片描述
概念
用于描述注解的注解就是元注解举例

@override
@Target(ElementType.METHOD)-->注解作用的位置
@Retention(RetentionPolicy.SOURCE)--》描述注解停留的阶段//source  
class runtimepublic @interface Override {}

元素
在这里插入图片描述
解析注解

获取注解中定义的属性值

获取任意的类执行该类的方法

注解用来替代配置文件

3、注解与反射案例

写一个注解添加的方法

public class BaseDao<T> {
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public int save(T t) throws Exception {
        //传过来的对象
        Class<?> aClass = t.getClass();
        //获取表名
        TableName annotation = aClass.getAnnotation(TableName.class);
        String name = annotation.name();



        //获得属性值
        Field[] declaredFields = aClass.getDeclaredFields();

        //存列名和值
        ArrayList<String> columns = new ArrayList<>();
        ArrayList<String> columnvalues = new ArrayList<>();

        if(declaredFields.length > 0){
            for (Field declaredField : declaredFields) {
                //属性值的
                TableColumn annotation1 = declaredField.getAnnotation(TableColumn.class);
                String name1 = annotation1.value();
//                System.out.println("列名"+name1);
                columns.add("`"+name1+"`");

                //通过属性名.get(对象)获得传过来的对象值
                declaredField.setAccessible(true);
                Object o = declaredField.get(t);
//                System.out.println("当前属性 : "+declaredField+"值 : " + o.toString());

                columnvalues.add("'"+o+"'");
            }
        }
        String tablecolumns = columns.toString().replace("[", "(").replace("]", ")");
        String tablevalue = columnvalues.toString().replace("[", "(").replace("]", ")");
        System.out.println(tablecolumns);
        System.out.println(tablecolumns);

        String sql = "insert "+ name +tablecolumns+"values"+tablevalue;
        System.out.println(sql);


        Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/casemanage?useUnicode=true&EncodingCharacter=utf-8", "root", "1214521");
        PreparedStatement preparedStatement = root.prepareStatement(sql);
        int i = preparedStatement.executeUpdate();
        return i;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 反射和注解 的相关文章

  • 在 Java 中捕获(捕获)窗口中的鼠标光标

    我正在寻找一种方法 在鼠标进入窗口后捕获或捕获该窗口中的鼠标 就像鼠标被捕获在虚拟机窗口中一样 直到用户按 CTRL ALT DEL 或以其他方式释放鼠标 我如何在 Java 中实现这一点 全屏显示不是一个选择 EDIT 这里有一些 SSC
  • 在 String 值之后打印 int 值

    我有以下示例代码 int pay 80 int bonus 65 System out println pay bonus bonus pay 有人可以向我解释一下为什么我得到以下输出 145 6580 您的代码正在从左到右解释表达式 pa
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 如何避免Eclipse在将类名放在注释中时导入类,以便checkstyle稍后不会抱怨?

    有时我将类名放在方法或类的注释中只是为了引用 但是 Eclipse 会自动执行导入并在文件中留下导入语句 这会导致稍后出现 未使用的导入 检查样式错误 当我在注释中输入类名时 是否可以更改一些配置以避免 Eclipse 自动导入 人们不同意
  • java项目中无法加载类“org.slf4j.impl.StaticLoggerBinder”错误? [复制]

    这个问题在这里已经有答案了 我越来越Failed to load class org slf4j impl StaticLoggerBinder 错误 我想将记录器写入文件 所以我使用了 log4j jar 并使用 apache tomca
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 为什么 java.util.Arraylist#clear 按照 OpenJDK 中的方式实现?

    http grepcode com file repository grepcode com java root jdk openjdk 6 b14 java util ArrayList java 473 http grepcode co
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • 我怎样才能限定我不“拥有”的自动装配设置器

    要点是 Spring Batch v2 测试框架具有JobLauncherTestUtils setJob与 Autowired注解 我们的测试套件有多个Job类提供者 由于这个类不是我可以修改的东西 我不确定如何限定它自动连接的作业 每个

随机推荐

  • 生产排程系统_甘特图控件XGantt——生产计划排程软件首选的APS控件

    作为最早拥有APS高级计划调度模块的甘特图控件XGantt 该模块推出几十年来 我们一直致力于为生产计划排程软件提供最优的APS解决方案 如今 甘特图 XGantt 在全球已经成为生产计划排程软件首选的APS控件 不仅被全球知名的大型ERP
  • echarts图例过多显示问题

    问题描述 当项目中使用echarts时 会遇到图例过多的问题 面板大小有限 本身饼图或者折线图等已占据面板大部分空间 图例过多时会使图形和图例产生压盖的情况 非常不美观 原因分析 翻阅echarts文档时 我们发现有api可以供我们使用 当
  • 不管人工智能发展如何,开发者都有必要了解 Linux 内核

    Linux 内核在计算机世界的地位有目共睹 称它为计算机世界的基石也不为过 而且它还是全球最大的开源项目 几乎最知名的科技公司都参与其中 包括谷歌 Red Hat SUSE Intel Facebook 甲骨文和华为等 当然还包括 Linu
  • CE6.0 RIL 移植(一)之多路复用MUX

    由于CE中MS提供了相应的代码 所以也是照搬过来了 当时自己摸索花了一些时间 特写下这个经历 以备后用 在移植MS的代码的过程中 最好是将相应的文档拷贝到自己的BSP中来 以防在修改的过程中出现错误了无法还原 MUX 移植 1 gt 拷贝C
  • package com.jiushipos; import android.content.Intent; import android.os.Bundle; import android.os.H

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • TCHAR和CHAR类型的互转

    Win32中CStdString 是需要TCHAR类型的值才可以赋值的 而很多文件读取时FILE的fopen函数之类的需要的是CHAR 我们需要把它们互转 这里我在网上找到了一个比较方便的方法 没有定义UNICODE 所以它里面的字符串就是
  • ECNA 2014 部分题解

    目录 D Generalized Roman Numerals 思维dp E Inspectors 拆点跑最小费用最大流 H Time Warp 模拟 A Cure for the Common Code KMP D Generalized
  • python中set index_Python set_index和reset_index详解

    再来介绍一下set index函数的使用 set index就是将列转换为索引 其参数如下 set index keys drop True append False inplace False verify integrity False
  • CentOS 7.9 如何安装Docker

    文章目录 版本选择 1 CentOS安装Docker 1 1 卸载 可选 1 2 安装docker 1 3 启动docker 1 4 配置镜像加速 2 CentOS7安装DockerCompose 2 1 下载 2 2 修改文件权限 2 3
  • linux apache + mysql +php no-yum

    学习PHP脚本编程语言之前 必须先搭建并熟悉开发环境 开发环境有很多种 例如LAMP WAMP MAMP等 这里我介绍一下LAMP环境的搭建 即Linux Apache MySQL PHP环境 一 首先安装操作系统 操作系统 centos6
  • 【推荐】好用的 XPath 插件

    好用的 XPath 插件 XPath Helper 插件介绍 Try XPath 背景 插件介绍 个人感觉 结尾 本菜鸡在写爬虫的时候 经常使用 XPath 提取数据 XPath Helper 以前一直用的 chrome 进行 xpath
  • 通过Dockerfile文件制作新镜像时一大堆报错

    换个好一点的网络 就没问题了
  • java 中的静态变量,静态代码块,动态代码块,构造方法执行顺序的深入探究

    原文 https blog csdn net qq 41063182 article details 81149798 类加载 第一次调用这个类的时候jvm虚拟机会通过类加载器在一个叫做方法区的逻辑内存中将所要用到的类的信息存放在里边 其中
  • python3中编码转化

    1 编码解码概念 首先要明白一些概念 调用函数的时候就不会出错了 编码 把数据变为01比特 网络通信中的编码也是这个意思 解码 从01比特恢复为有意义的表示形式 在python3中 字符串是str类型 而bytes类型表示的是一个字节串 从
  • 文献阅读(24)KDD2020-GCC:Graph Contrastive Coding for Graph Neural Network Pre-Training

    本文是对 Graph Contrastive Coding for Graph Neural Network Pre Training 一文的浅显翻译与理解 如有侵权即刻删除 朋友们 我们在github创建了一个图学习笔记库 总结了相关文章
  • Open3D 计算每个点的协方差矩阵

    目录 一 算法原理 1 计算公式 2 主要函数 3 函数源码 二 代码实现 三 结果展示 一 算法原理 1 计算公式 对于点云数据中的任意一点 p p p 根据其邻域内点的坐标计算其协方差矩阵 计算公式如下 M
  • kubesphere中间件部署

    微服务部署前中间件部署 一 MySQL部署 1 1 使用Docker实现MySQL主从复制 docker run p 3307 3306 name mysql master v mydata mysql master log var log
  • 文本处理(六)——Text-CNN、Word2Vec、RNN、NLP、Keras、fast.ai

    原文 https www jianshu com p 7f35a4b33f45 Text CNN Text CNN 文本分类 TextCNN 是利用卷积神经网络对文本进行分类的算法 由 Yoon Kim 在 Convolutional Ne
  • uiautomator2滑动操作d.swipe_ext(),及判断是否ui到顶部

    d swipe ext up 向上滑动 d swipe ext down 向下滑动 d swipe ext left 向左滑动 d swipe ext right 向右滑动 判断当前页面是否在底部 while True d swipe ex
  • java 反射和注解

    文章目录 1 反射 1 1定义反射 1 2java代码的三个阶段 1 3将类的各个部分封装的对象 1 4获取 1 4 1获取类名 1 4 2获取成员变量 1 4 3获取构造方法 1 4 4获取成员方法 1 4 5获取注解 2 注解 2 1概