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

反射及其应用---->2

目录

1.使用类对象

1.1创建对象

1.2使用对象属性

1.3使用方法

2.反射操作数组

3.反射获得泛型

4.类加载器

4.1双亲委派机制

4.2自定义加载器


1.使用类对象

  • 通过反射使用类对象,主要体现3个部分

  • 创建对象,调用方法,调用属性(存值,取值)

1.1创建对象

利用反射创建对象有两种方式

  1. 通过构造器创建对象(推荐)

  2. 通过Class直接创建对象(只支持利用无参构造器创建对象)

Object o = c.newInstance(); //使用无参构造器创建对象Constructor con = c.getConstructor(int.class, int.class);
//A a = new A(10,20);
Object o = con.newInstance(10, 20);

1.2使用对象属性

  • 包括使用属性赋值, 使用属性取值。

  • 需要先获得要操作的属性对象

Object a1 = c.newInstance();Field n = c.getField("n"); //获得的public的属性n.set(a1,"XXXX");Object value = n.get(a1);
System.out.println(value);
//私有属性,可以通过设置i.setAccessible(true) 实现对私有成员的访问
//注意1: 使用后,建议将其重新锁住  i.setAccessible(false)
//注意2: 强烈不推荐使用该方式操作私有成员,建议通过封装,提供对应的get和set方法。
Field i = c.getDeclaredField("i");
i.setAccessible(true);
i.set(null,100); //传递null,是因为i属性是一个static属性
Object value = i.get(null);
System.out.println(value);
i.setAccessible(false);
  • 在jdk1.9之后,对java中的类库做了重新的处理

  • 增加了一个模块的功能,成员属于类,类属于包,包属于模块, 模块属于程序

    • 包中的类需要export导出,其他模块中的类才可见。

    • 包中未导出的类,其他模块中的类不可见,不可引入,不可反射操作

    • 当然,可以通过jvm参数配置,使得模块中的内容都可以反射操作。

1.3使用方法

反射调用对象的方法,需要先获得对应的Method方法对象

  • 获得Method对象时,除了指定方法名,还需要指定方法的参数列表(Class)

  • 调用方法时,需要指定所属对象(static方法所属null或Class),需要传递具体的参数值(Object)

Object a = c.newInstance();
Method m = c.getMethod("t1", int.class, int.class);//t1(int,int)
//a.t1(100,200);
Object r = m.invoke(a, 100, 200);
Method m = c.getDeclaredMethod("t2");//t2()
m.setAccessible(true);
m.invoke(a) ;
m.setAccessible(false);

2.反射操作数组

反射操作数组,使用的是Array类

//Object array = new int[5];
//array[1] (取值, 赋值)
Object array = Array.newInstance(int.class, 5);Array.set( array , 0 , 250 );Object value = Array.get(array, 0);
System.out.println(value);int len = Array.getLength(array);
System.out.println(len);

3.反射获得泛型

关于反射获得泛型,有两种操作需求

  1. 获得类定义时的泛型 T , V , K , E

public static void t1(){Class c = A.class;TypeVariable[] typeParameters = c.getTypeParameters();//类定义时的泛型System.out.println(typeParameters.length);System.out.println(typeParameters[0].getName());
}

    2.获得类使用时的泛型,具体的类型 List<String>

public static void t2() throws NoSuchFieldException, NoSuchMethodException {Class c = B.class ;Field a = c.getDeclaredField("a");Type type = a.getGenericType();//一般getGeneric系列,都是用来获得所包含的泛型的。//(属性类型,返回类型,参数类型,父类型,父接口类型)都有该系列方法//Class is a Type  //泛型类型,也称为参数化类型 is a Type , 本质是 ParameterizedTypeParameterizedType pt = (ParameterizedType) type;//Type[] pts = pt.getActualTypeArguments(); //获得多个泛型的数组Type rawType = pt.getRawType();//获得泛型类型}

4.类加载器

  • JVM在运行程序时,会使用类加载器,加载(读取)类文件的信息,并对其进行一系列的处理,最终将其存储在方法区,并生成与之对应的Class对象。

  • 类信息有不同的情况

    • 有我们自己的写的类信息

    • 有jdk自带的类信息

    • 未来可能还有其他的类信息,如:网络中的类信息,需要加密处理类信息等。

  • jdk针对于不同的类信息情况,提供了不同的类加载器,默认有3种

    1. BootstrapClassLoader 启动类加载器,使用C/C++实现,加载jdk基本类库,如:java.lang等

    2. ExtClassLoader 扩展类加载器,使用Java实现的,加载jdk扩展类库

    3. AppClassLoader 应用类加载器,使用Java实现的,classpath路径中的类,我们自己编写的类

4.1双亲委派机制

  • jdk提供了3个加载器,未来我们还能自定义加载器

  • jdk同时提供了双亲委派机制,使得多个加载器可以更合理的协作应用

    1. 当我们在程序中需要使用一个类时,会先向最底层的类加载器申请这个类(app)

    2. 如果app加载器加载过这个类,就会返回该类的Class对象

    3. 如果app没有加载过这个类,app会向其父级加载器(ext)申请这个类

    4. 如果ext加载过就返回这个类,如果没有加载过这个类,继续想起父级(Bootstrap)申请

    5. 如果bootstrap加载过就返回这个类,如果没有加载过,就尝试加载

    6. 如果在bootstrap的加载范围内,则加载这个类

    7. 如果不再bootstrap的加载范围内, 尝试让ext加载

    8. 如果在ext加载范围内,就让ext加载。如果不在就尝试让app加载

    9. 如果在app加载范围内,就让app加载,否则就抛出ClassNotFoundException

  • 注意:app 和 ext 和 bootstrap是逻辑上的子父级关系,不是真正 的extends继承关系

  • 双亲委派机制的优点

    1. 防止核心类被篡改。

    2. 方式类重复加载

    3. 防止在核心包中扩展类(沙箱机制)

4.2自定义加载器

  • 哪些情况需要自定义类加载器呢?

    1. 扩展加载源 ,如:从网络中加载类库

    2. 类的隔离

    3. 类信息的解密

  • 如何自定义类加载器

    1. 自定义加载器类, 继承ClassLoader

    2. 重写方法

      • 可以重写loadClass方法,但不推荐。因为该方法中提供了双亲委派机制

        如果重写该方法,相等于破坏了双亲委派机制。

      • 可以重写findClass方法,根据需求,去指定的地方获取类文件信息

        以byte[]的形式装载找到的类信息

      • 还有一个很重要的方法defineClass(),用来将字节码内容进行一系列的处理,并存储在方法区,并生成Class对象

        所以在findClass之后,一定要调用该方法。

    3. 使用类加载器

public class MyClassLoader extends ClassLoader{//name 一般就是com.buka.User 类路径//可以根据这个类路径确定最重要加载的目标类@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {try {Socket link = new Socket("localhost",6666);InputStream is = link.getInputStream();//存储所有读取到的字节信息//本来是需要使用字节数组//但无法确定从网络中读取字节的数量,就不知道要定义多长的字节数组//可以使用ByteArrayOutputStreamByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] bs =new byte[010];while(true){int len = is.read(bs);if(len == -1){break ;}bos.write(bs,0,len);}byte[] content = bos.toByteArray();return  super.defineClass("X",content,0,content.length);} catch (IOException e) {throw new RuntimeException(e);}}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {MyClassLoader loader  = new MyClassLoader();Class<?> c = loader.loadClass("X");c.newInstance();
}

相关文章:

反射及其应用---->2

目录 1.使用类对象 1.1创建对象 1.2使用对象属性 1.3使用方法 2.反射操作数组 3.反射获得泛型 4.类加载器 4.1双亲委派机制 4.2自定义加载器 1.使用类对象 通过反射使用类对象&#xff0c;主要体现3个部分 创建对象&#xff0c;调用方法&#xff0c;调用属性&#xff…...

[Python学习日记-32] Python 中的函数的返回值与作用域

[Python学习日记-32] Python 中的函数的返回值与作用域 简介 返回值 作用域 简介 在函数的介绍中我们提到了函数的返回值&#xff0c;当时只是做了简单的介绍&#xff0c;下面我们将会进行详细的介绍和演示&#xff0c;同时也会讲一下 Python 中的作用域&#xff0c;作用域分…...

儿童发光耳勺值得买吗?儿童发光耳勺最建议买的五个牌子!

儿童耳部清洁需谨慎&#xff0c;发光耳勺能在光线不足时提供照明&#xff0c;便于看清耳道。但不同产品质量参差不齐&#xff0c;选择时需综合考虑安全性、实用性等因素&#xff0c;为孩子的耳部健康做出正确选择&#xff01; 这里给大家总结了全新的儿童发光耳勺的避雷指南&am…...

TIPS 二进制程序暴露符号给动态链接库使用

背景 在支持插件/扩展的C/C系统中&#xff0c;通常会支持在程序运行时加载动态链接库。这时二进制程序会提供一些函数/接口让动态链接库调用&#xff0c;但是这些函数在二进制程序中又不会使用&#xff0c;导致在编译时编译器直接把这些符号删除了&#xff0c;加载链接库就会由…...

【分布式微服务云原生】8分钟掌握微服务通信的艺术:Dubbo与OpenFeign全面解析

摘要&#xff1a; 在构建微服务架构时&#xff0c;服务间的通信机制是核心要素之一。Dubbo和OpenFeign是两个非常流行的服务调用框架&#xff0c;它们各有千秋&#xff0c;适用于不同的场景。本文将深入探讨Dubbo和OpenFeign的主要特点、使用场景以及它们之间的差异&#xff0c…...

sicp每日一题[2.33]

Exercise 2.33 Fill in the missing expressions to complete the following definitions of some basic list-manipulation operations as accumulations: ; p 表示一个函数&#xff0c;sequence 表示一个列表 ; 这个函数将对列表中每一个元素进行 p 操作 (define (map p sequ…...

【Mybatis】常见面试题汇总 共56题

文章目录 1. 介绍下MyBatis?2. MyBatis 框架的应用场景?3. MyBatis 有哪些优点?4. MyBatis 有哪些缺点?5. MyBatis 用到了哪些设计模式&#xff1f;6. MyBatis常用注解有哪些&#xff1f;7. MyBatis 有哪些核心组件?8. MyBatis编程步骤是什么样的&#xff1f;9. MyBatis 和…...

每天一道面试题(17):服务网格学习笔记

什么是服务网格&#xff1f; 服务网格&#xff08;Service Mesh&#xff09;是处理微服务间通信的一种基础设施层。它主要用于解耦服务间的通信与业务逻辑&#xff0c;使开发者可以专注于业务实现。服务网格在微服务架构的演进中扮演了重要角色&#xff0c;特别是在解决服务间…...

【nrm】npm 注册表管理器

nrm是什么 nrm&#xff08;NPM Registry Manager&#xff09;是一个用于管理 Node.js 包管理器&#xff08;如 npm 和 Yarn&#xff09;的注册表工具。它可以帮助用户快速切换不同的 npm 源&#xff0c;以便于提高包安装的速度和效率&#xff0c;特别是在中国大陆地区&#xf…...

解压短视频素材资源网站推荐

如果你正在寻找解压短视频素材&#xff0c;那么这篇文章正是为你而写&#xff01;以下是一些热门的网站&#xff0c;帮助你轻松找到所需的素材&#xff0c;快来看看吧&#xff01; 蛙学网 蛙学网是国内领先的视频素材网站&#xff0c;提供丰富的解压视频素材。无论是放松心情的…...

Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动

文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中&#xff0c;我们通过buildroot制作了根文件系统&#xff0c;并通过 SD卡的形式将其挂载到设备并成功进行了启动&#xff0c;但上一章中&#xff0c;我们的…...

Spring Boot中使用ThreadPoolTaskScheduler实现轻量级多线程定时任务

引言 在Java开发中&#xff0c;Spring Boot提供了多种方式来执行定时任务&#xff0c;如Scheduled注解和TaskScheduler。当需要执行多线程定时任务时&#xff0c;ThreadPoolTaskScheduler是一个轻量级的解决方案。本文将通过一个具体的业务场景&#xff0c;介绍如何使用Thread…...

完全二叉树的节点个数 C++ 简单问题

完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层&#xff0c;则该层包含 1~ 2h 个节点。 示例 1&#xff…...

每日一题学习笔记

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#…...

从事人工智能学习Python还是学习C++?

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是当今科技领域最热门的研究方向之一。AI 涉及多个学科和技术&#xff0c;特别是机器学习、神经网络、深度学习等技术的应用。在AI的开发过程中&#xff0c;编程语言的选择对于开发效率和项目实现至…...

博客摘录「 CNN中的感受野和有效感受野会对模型产生怎样的影响?」2024年9月29日

&#xff0c;中心像素受影响较大&#xff0c;离中心越远梯度信号越弱。梯度信号的衰减是指数级的&#xff0c;这意味着应用于感受野的大多数像素的梯度将是可忽略的(如果有的话)。 有效感受野的定义...

AURIX单片机示例:开发入门与点亮LED

文章目录 目的模板工程Blinky_LED示例链接总结 目的 这个例程比较简单&#xff0c;主要通过这个例程来介绍 AURIX™ Development Studio(ADS) 和 iLLD 库来开发 AURIX 系列单片机一些入门的内容。一些更为基础的资料等内容可以参考下面文章&#xff1a; 《英飞凌 AURIX TriCo…...

MySQL字符串函数与操作

在编程领域中,字符串操作是数据处理中至关重要的一部分。无论是文本分析、日志处理,还是格式化输出,字符串的操作技能都能极大提高工作效率。在 Python 中,字符串相关的函数和方法为开发者提供了强大的工具,帮助完成各种任务。了解如何灵活运用这些工具,能够有效提升编程…...

HTML+CSS 水滴登录页

文章目录 一、效果演示二、Code1.HTML2.CSS 三、实现思路拆分 一、效果演示 实现了一个水滴登录页的效果。页面包含一个水滴形状的登录框和两个按钮&#xff0c;登录框包括用户名、密码和登录按钮&#xff0c;按钮分别为忘记密码和注册。整个页面的设计非常有创意&#xff0c;采…...

基于Next.js和TailwindCss的TailwindCss

最近在研究 Next.js 和 TailwindCss &#xff0c;这两天没事的时候就搞了一个 c。 目前工具部署在 Vercel &#xff0c;欢迎各位体验&#xff08;能提出意见更好嘿嘿&#xff09; 体验地址&#xff1a; https://icon.999872.xyz/ 图片预览 &#x1f447;...

论文AI率怎么免费降?【2026建议收藏】DeepSeek/Kimi/豆包三大模型专属降重指令全家桶

很多时候大学生写论文逻辑太严谨、话术太规范&#xff0c;反而会导致AI率过高&#xff0c;且一旦AI率过高&#xff0c;轻则退回重改&#xff0c;重则取消答辩资格&#xff0c;这后果谁都担不起。 为了帮大家有效降低aigc率&#xff0c;这周我专门针对目前市面上最主流的三款大…...

Phi-4-Reasoning-Vision行业应用:制造业设备巡检图故障推理与维修建议生成

Phi-4-Reasoning-Vision行业应用&#xff1a;制造业设备巡检图故障推理与维修建议生成 1. 技术背景与价值 在制造业设备维护领域&#xff0c;传统的人工巡检方式存在效率低、主观性强、经验依赖严重等问题。Phi-4-Reasoning-Vision多模态大模型为这一场景带来了革命性的解决方…...

蓝桥杯备赛避坑指南:从校赛落选到国三逆袭的实战经验分享

蓝桥杯备赛避坑指南&#xff1a;从校赛落选到国三逆袭的实战经验分享 第一次参加蓝桥杯校赛时&#xff0c;我连最简单的编程题都没能完整写出。看着屏幕上仅完成的两道签到题和一堆未通过的测试用例&#xff0c;那种挫败感到现在都记忆犹新。但正是这次失败&#xff0c;让我后来…...

别再硬编码了!用CRMEB标准版的可视化定时任务,5分钟搞定自动发券

告别硬编码时代&#xff1a;CRMEB可视化定时任务实战指南 在电商系统开发中&#xff0c;定时任务就像一位不知疲倦的助手&#xff0c;默默处理着自动发券、订单状态更新、数据清理等重复性工作。但传统开发方式往往需要开发者手动编写Crontab配置或硬编码任务逻辑&#xff0c;不…...

MAI-UI-8B部署全攻略:开箱即用,快速体验GUI智能体强大功能

MAI-UI-8B部署全攻略&#xff1a;开箱即用&#xff0c;快速体验GUI智能体强大功能 1. 认识MAI-UI-8B&#xff1a;能"动手"的AI智能体 大多数AI助手只能回答问题或生成内容&#xff0c;而MAI-UI-8B却能做到真正意义上的"动手操作"。这是一个能够理解图形用…...

颠覆3种时间黑洞:用Obsidian日历重构你的工作流

颠覆3种时间黑洞&#xff1a;用Obsidian日历重构你的工作流 【免费下载链接】obsidian-full-calendar Keep events and manage your calendar alongside all your other notes in your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian-full-calendar…...

无数据库版Mirror照妖镜源码解析:如何安全改造为个人图片鉴黄工具

无数据库版Mirror照妖镜源码解析&#xff1a;如何安全改造为个人图片鉴黄工具 在当今内容爆炸的时代&#xff0c;图片审核成为许多个人开发者和内容创作者的刚需。传统解决方案往往依赖复杂的数据库系统和第三方API&#xff0c;而Mirror照妖镜的无数据库设计为轻量级图片审核提…...

解密革命性构建工具:PoeCharm如何突破传统限制实现高效角色规划

解密革命性构建工具&#xff1a;PoeCharm如何突破传统限制实现高效角色规划 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 在流放之路的复杂游戏生态中&#xff0c;角色构建往往成为玩家面临的最大…...

Python 3.15 JIT不是“可选优化”——而是CPython官方首次强制嵌入的LLVM后端(2024 Q3起新项目默认启用)

第一章&#xff1a;Python 3.15 JIT 的历史定位与架构革命Python 3.15 标志着 CPython 运行时的一次范式跃迁——它首次将生产就绪的、默认启用的即时编译&#xff08;JIT&#xff09;引擎深度集成至解释器核心&#xff0c;而非作为外部补丁或实验性分支存在。这一设计终结了自…...

nli-distilroberta-base代码实例:Python调用DistilRoBERTa实现Entailment识别

nli-distilroberta-base代码实例&#xff1a;Python调用DistilRoBERTa实现Entailment识别 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务&#xff0c;用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBER…...