注解和反射03(Java)

news2024/11/24 17:58:51

#拓展开题:

类的加载与ClassLoader的理解

什么时候会发生类初始化?

 类加载器的作用

 

动态创建对象执行方法

有了Class对象,能做什么?

newInstance()是一个Java中使用反射创建对象实例的方法,通过该方法可以获取类的构造函数,并创建出一个新的对象实例。(类似于new)

method.invoke()就是调用类中的方法,第一个参数是obj(对象),在我们平常使用过程中用到的是类,类是对象的一个集合,第二个参数是args(参数),是调用invoke这个方法所使用的参数,我们使用是一般是类中的方法(method),因此invoke方法我们也可以这样理解:invoke(class,method),相当于把类中的方法参数化了。(简单理解:激活的意思)

field.setAccessible是Java反射中的一个方法,用于设置一个字段(Field)的可访问性。通过调用该方法,可以使得一个私有字段也可以被访问和修改。具体来说,该方法接受一个布尔值作为参数,如果为true,则表示该字段可以被访问和修改;如果为false,则表示该字段仍然是私有的,无法被访问和修改。

package reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test04 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        //获得Class对象
        Class c1 = Class.forName("reflection.User");

        //构造一个对象
        User user = (User) c1.newInstance();//本质是调用了类的无参构造
        System.out.println(user);

        //通过构造器创建对象
        Constructor constructor = c1.getDeclaredConstructor(String.class, int.class, int.class);
        User user2 = (User) constructor.newInstance("权业轩", 001, 16);
        System.out.println(user2);

        //通过反射调用普通方法
        User user3 = (User)c1.newInstance();
        //通过反射获取一个方法
        Method setName = c1.getDeclaredMethod("setName", String.class);
        setName.invoke(user3,"龙阳");//invoke:激活的意思
        System.out.println(user3.getName());

        //通过反射操作属性
        User user4 = (User)c1.newInstance();
        Field name = c1.getDeclaredField("name");

        name.setAccessible(true);//取消安全检测(因为上面权限不够,name的权限是private)
        name.set(user4,"龙葵");
        System.out.println(user4.getName());

    }
}

 补充:

调用指定的方法:

 

性能对比分析:

package reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

//分析性能问题
public class Test05 {
    //普通方式调用
    public static void test01() {
        User user = new User();
        long statrTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            user.getName();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("普通方式执行10亿次:" + (endTime - statrTime) + "毫秒");
    }

    //反射方法调用,无setAccessible
    public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user = new User();
        Class c1 = user.getClass();
        Method getName = c1.getDeclaredMethod("getName", null);
        long statrTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(user, null);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("反射方式执行10亿次:" + (endTime - statrTime) + "毫秒");

    }

    //反射方法调用,关闭检测
    public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        User user = new User();
        Class c1 = user.getClass();
        Method getName = c1.getDeclaredMethod("getName", null);
        getName.setAccessible(true);
        long statrTime = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            getName.invoke(user, null);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("反射方式关闭检测执行10亿次:" + (endTime - statrTime) + "毫秒");
    }

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        test01();
        test02();
        test03();
    }
}

运行结果:

由于输出关系,反射方式执行10亿次应该是4.057毫秒,关闭检测后是1.846毫秒,所以建议关闭检测来执行反射。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能物流监控系统的数据平台技术研究

完整资料进入【数字空间】查看——baidu搜索"writebug" 1.1 项目背景 物联网技术是利用传感器嵌入各种末端设备&#xff0c;通过无线或有线网络接入互联网以实现人与物、物与物实时互联的新兴技术[1]。 智能物流监控系统是在物流量越来越大、物流价值越来越贵重的背…

【Distributed】zookeeper+kafka的应用及部署

文章目录 一、zookeeper1. zookeeper的概述1.1 Zookeeper 定义1.2 Zookeeper 工作机制1.3 Zookeeper 特点1.4 Zookeeper 数据结构1.5 Zookeeper 应用场景1.6 Zookeeper 选举机制第一次启动选举机制非第一次启动选举机制选举Leader规则 2. 部署 Zookeeper 集群2.1 安装前准备2.2…

MySQL数据库表数据的基本操作

目录 1.创建表 2.插入数据 3.修改表数据 3.1、将所有员工薪水修改为5000元 ​3.2、将姓名为张三的员工薪水修改为3000元 ​3.3、将姓名为李四的员工薪水修改为4000元gender改为女 ​3.4、将王五的薪水在原有基础上增加1000元 4、MySQL字符集 1.创建表 创建员工表emplo…

【技巧】Latex在线工具:公式编辑器、表格编辑器

找到什么再补充 目录 表格编辑器 公式编辑器 表格编辑器 https://www.tablesgenerator.com/ 公式编辑器 https://www.latexlive.com/

数据库开发和数据库管理有什么区别?

数据库开发&#xff08;Database Development&#xff09;和数据库管理&#xff08;Database Administration&#xff09;是数据库领域中的两个关键角色和职责。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 数据库开发人员专注于以下方面&#xff1a…

windows安装gitlab-runner提交gitlab自动打包maven包

运行环境&#xff1a; 私服gitlab,想使用gitlab的ci/cd自动打包&#xff0c;不需要将打好的包部署到远程服务器而是保存在本地的&#xff0c;可以在本地安装gitlab-runner,打好的包直接在本地生成 本地是window环境 1 本地安装maven https://maven.apache.org/download.cgi …

Python批量对word文件重命名

一、背景 在日常工作或学习中&#xff0c;我们可能会遇到需要对大量的 Word 文件进行重命名的情况。手动一个一个修改文件名费时费力&#xff0c;而编写一个 Python 脚本则可以自动化完成这个任务&#xff0c;提高效率。 二 、开发环境 为了实现批量对 Word 文件进行重命名的功…

leaflet在天地图上添加poi兴趣点

前言 书接上节&#xff0c;在上一篇博客加载的天地图的基础上&#xff0c;加载poi兴趣点。 上节传送&#xff1a;使用leaflet在html中加载天地图且去掉左上角的缩放图标以及右下角的logo 一、加载poi的方法 leaflet通过 L.marker 方法用来加载poi&#xff0c;我们只需填入p…

嵌入式Linux领域中的C++:应用层主力与挑战

嵌入式Linux领域中&#xff0c;C是应用层的主要编程语言之一。尽管QT/C在某些领域被Android/Java逐渐替代&#xff0c;但在医疗、工控、车载导航等领域仍占主导地位。对于嵌入式人员学习C的观点存在一定片面性。C的难点在于移动语义、模板偏特化、lambda表达式、模板元编程等知…

Unity实现全景图

1.前言 实现全景查看有两种方式&#xff0c;一种是创建天空盒&#xff0c;另外一种是全景图渲染到一个球形上&#xff0c;从内球内部看。两者都可以用天空盒材质Skybox实现。 2.创建天空盒材质 先创建一个材质球命名为Sky&#xff0c;在 Shader 下拉选单中&#xff0c;单击 Sk…

视觉算法知识荟萃

文章目录 视觉算法知识荟萃视觉算法八股手写卷积Delta KAbs RelRMSESilogVNLSoftMaxCrossEntropySwin-TransformerTransformerAdam&#xff0c;SGD如何修改SGD&#xff0c;使其不陷入局部最小值 NMSSoftNMS 边缘检测算法SobelLaplacianCanny Pooling Layer手写 Pooling LayerPo…

OpenGauss ustore查询过程的流程

查询流程&#xff1a; 以 Select c2 from tb1 where c1 1为例&#xff1a; 1、根据索引找到TID(1,2)的元组指针&#xff0c;即linePointer。 2、计算其事务xid是否可见&#xff0c;在Map中计算其csn和快照csn的大小关系。 3、如果大于快照CSN&#xff0c;那么不可见&#xff0…

智能仪表在铁塔行业应用 安科瑞 许敏

应用场景 可应用于基站的交直流配电箱及对基站内的动力设备进行数据采集和控制。 功能 1. 对多个回路进行全电参量测量&#xff0c;实现基站内各回路用电能耗的集中管理&#xff1b; 2. 丰富的DI/DO输入输出&#xff0c;NTC测温&#xff0c;温湿度测量等非电参量监测&#x…

​ 基于单片机智能温室大棚控制系统

功能介绍 以51单片机作为主控系统&#xff1b; DS18B20温度采集模块检测温度&#xff1b; 光敏电阻和ADC0832组成的光照检测模块&#xff1b; 土壤湿度检测模块检测土壤湿度&#xff1b; CO2检测模块检测CO2浓度&#xff1b; LCD1602显示模块显示测量值、 若温度小于温度最…

uni-data-checkbox多选框max属性无法设置为0解决方案

找到组件源码&#xff0c;搜索 setRange 方法&#xff08;改掉之后&#xff0c;组件必须添加 max属性和值&#xff01;&#xff01;&#xff01;&#xff09;

使用python将32位的bmp转成24位的

前言 一个临时需求&#xff0c;要将32位的bmp图像转成24位的 代码 使用opencv读取图片&#xff0c;然后重新存一下就可以。我看有些博主就这个内容还设置了收费&#xff0c;也不害臊。 import cv2if __name__ "__main__":img cv2.imread("IMG-0001-00001.…

MySQL数据库管理(一)

文章目录 一.数据库基本操作1.查看数据库结构1.1 查看数据库信息1.2 查看数据库中的表信息1.3 显示数据表的结构&#xff08;字段&#xff09; 2.数据库的存储方式 二.数据库管理1.DDL&#xff1a;数据定义语言1.1 创建新的数据库1.2 创建新的表1.3 删除指定的数据表1.4 删除指…

关于虚拟机kali系统忘记密码修改密码的操作

1、启动kali虚拟机&#xff0c;进入GRUB菜单&#xff0c;选中kali GNU/Linux 按e 进入编辑状态 2、在编码文档里找到linux ...root....quiet 3、在末尾添加 rw single init/bin/bash single --进入单用户模式 rw --根分区的挂载模式默认是只读&#xff08;ro&#xff09;,…

最全整理,web自动化测试框架总结-实战案例,从0精通封装...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 web自动化测试框架…

第2讲 KMD ISP子系统缩略词及目录结构

QCOM Camera子系统缩略词介绍 CPAS(Camera Peripherals and Support)CDM(Camera Data Mover)TFE(Thin Front End)IFE(Image Front End)OPE(Offline Processing Engine)BPS(Bayer Processing Segment)SFE(Sensor Front End)LRME(Low Resolution Motion Estimation)CSID(Camera …