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

Java反射示例

Java反射示例

  1. 创建数据类型ReflectPoint.java
package com.reflection;import java.util.Date;public class ReflectPoint {private Date birthday = new Date();private int x;public int y;public String str1 = "ball";public String str2 = "basketball";public String str3 = "itany";public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getStr1() {return str1;}public void setStr1(String str1) {this.str1 = str1;}public String getStr2() {return str2;}public void setStr2(String str2) {this.str2 = str2;}public String getStr3() {return str3;}public void setStr3(String str3) {this.str3 = str3;}public ReflectPoint(int x, int y) {super();this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}@Overridepublic String toString() {return str1+"\t"+str2+"\t"+str3+"\t"+birthday;}
}
  1. 创建测试类
package com.reflection;import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;public class ReflectTest {public static void main(String[] args) throws Exception {//3种方法获得字节码文件String str1="abc";Class cls1=str1.getClass();//通过对象得到该对象在内存中的字节码文件Class cls2=String.class;//通过数据类型得到字节码文件/*** 如果内存中有该字符串指定的字节码,就直接用,如果没有就创建一个。*/Class cls3=Class.forName("java.lang.String");//通过forName方法获得//注意:所有相同类型的对象都共享一个class对象//class称为类的类型System.out.println(cls1==cls2);System.out.println(cls1==cls3);//判断下面的数据类型是否是基本数据类型System.out.println(cls1.isPrimitive());System.out.println(int.class.isPrimitive());/*** Integer是基本数据类型int的包装类,里面有方法。* Integer 类在对象中包装了一个基本类型 int 的值。*/System.out.println(int.class==Integer.class);//通过字节码文件判断整型和它的包装类在内存中是否是一份字节码System.out.println(int.class==Integer.TYPE);//通过整数数组的字节码文件判断整型数组是不是一种基本数据类型System.out.println(int[].class.isPrimitive());//通过整数数组的字节码文件判断整型数组是不是数组System.out.println(int[].class.isArray());System.out.println(void.class.isPrimitive());//把一个字符串转成整型的方法String s1="123";int s11=Integer.parseInt(s1);//反射开始//String str2=new String(new StringBuffer("abc")); //正常的构建一个字符串对象// String s3=new String("abc");//用反射去构建str2//通过String类型的字节码得到了一个构造方法,构造方法的区别是通过参数的类型进行甄别,//constructor1就是一个构造方法Constructor constructor1=String.class.getConstructor(String.class);//根据取得的构造方法创建实例,需要传入相应的参数String str2=(String)constructor1.newInstance(/*new StringBuffer("abc")*/"abc");System.out.println(str2.charAt(2));ReflectPoint pt1=new ReflectPoint(3,5);//构造一个点的对象Field fieldY=pt1.getClass().getField("y");//fieldY的值是多少?是5,错误的!fieldY不是对象上的变量,而是类上的,要用它去取某个对象上的值。System.out.println(fieldY.get(pt1));Field fieldX=pt1.getClass().getDeclaredField("x");fieldX.setAccessible(true);//暴力反射,强制访问System.out.println(fieldX.get(pt1));        changeStringValue(pt1);System.out.println(pt1);        //用反射来实现str2.charAt(2)方法Method methodcharAt=String.class.getMethod("charAt", int.class);//通过反射得到了charAt方法System.out.println(methodcharAt.invoke(str2, 2));//第一个参数是对象,第二个参数是具体的值//调用一下别的类的main方法//TestArguments.main(new String[]{"111","222","333"});//传统调用String startingClass=args[0];//约定在该类运行时传递的第一个参数是要调用类的名字。Method methodMain=Class.forName(startingClass).getMethod("main", String[].class);//通过字节码得到main方法// methodMain.invoke(null, new Object[]{new String[]{"111","222","333"}});//由于invoke要做解包动作,所有外面再打一个对象数组包methodMain.invoke(null, (Object)new String[]{"111","222","333"});//告诉编译器,把后面的数组当成一个对象看待,不需要解包。//数组反射int[] a1=new int[]{1,2,3};int[] a2=new int[4];int[][]a3=new int[2][3];String[]a4=new String[]{"a","b","c","d"};System.out.println(a1.getClass()==a2.getClass());//System.out.pritnln(a1.getClass()==a3.getClass());//唯数不一样//System.out.println(a1.getClass()==a4.getClass());//类型不一样System.out.println(a1.getClass().getName());//得到字节码的名字System.out.println(a3.getClass().getName());System.out.println(a4.getClass().getName());System.out.println(a1.getClass().getSuperclass().getName());//得到字节码的父类是谁System.out.println(a4.getClass().getSuperclass().getName());Object aObj1=a1;//让一个父类引用指向它的子类对象。Object aObj2=a4;//Object[] aObj3=a1;Object[] aObj4=a3;Object[] aObj5=a4;System.out.println(a1);System.out.println(a4);System.out.println(Arrays.asList(a1));System.out.println(Arrays.asList(a4));printObject(a1);printObject(a4);printObject("xyz");//加载配置InputStream in = ReflectionTest.class.getClassLoader().getResourceAsStream("config.properties");Properties props = new Properties();props.load(in);in.close();String className = props.getProperty("className");Collection c=(Collection)Class.forName(className).newInstance();ReflectPoint pt1=new ReflectPoint(3,3);ReflectPoint pt2=new ReflectPoint(5,5);ReflectPoint pt3=new ReflectPoint(3,3);c.add(pt1);c.add(pt2);c.add(pt3);c.add(pt1);System.out.println(c.size());}private static void printObject(Object obj) {// TODO Auto-generated method stubClass clazz=obj.getClass();//得到传进来对象的字节码if(clazz.isArray()){//如果传进来的是数组,需要使用Array类//得到数组的长度int len=Array.getLength(obj);for(int i=0;i<len;i++){System.out.println(Array.get(obj, i));}}else{//如果传进来的不是数组,是单值System.out.println(obj);}}private static void changeStringValue(Object obj) throws Exception {// TODO Auto-generated method stubField[] fields=obj.getClass().getFields();//得到该对象字节码上的所有方法for(Field field:fields){//遍历字段数组//if(field.getType().equals(String.class)){//判断字段的类型是否是Stringif(field.getType()==String.class){//字节码在内存中只有一份,所有用==去比较	String oldValue=(String)field.get(obj);//取得该对象上的值String newValue=oldValue.replace('b', 'a');//修改数据field.set(obj, newValue);//把新值重新设置回对象里}}}}class TestArguments{public static void main(String[]args){		for(String arg:args){System.out.println(arg);}		        }	
}

相关文章:

Java反射示例

Java反射示例 创建数据类型ReflectPoint.java package com.reflection;import java.util.Date;public class ReflectPoint {private Date birthday new Date();private int x;public int y;public String str1 "ball";public String str2 "basketball"…...

【WinForm.NET开发】实现使用后台操作的窗体

本文内容 创建使用后台操作的窗体使用设计器创建 BackgroundWorker添加异步事件处理程序添加进度报告和取消支持Checkpoint 如果某项操作需要很长的时间才能完成&#xff0c;并且不希望用户界面 (UI) 停止响应或阻塞&#xff0c;则可以使用 BackgroundWorker 类在另一个线程上…...

【操作系统和计网从入门到深入】(四)基础IO和文件系统

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…...

四.Winform使用Webview2加载本地HTML页面并互相通信

Winform使用Webview2加载本地HTML页面并互相通信 往期目录本节目标核心代码实现HTML代码实现的窗体Demo2代码效果图 往期目录 往期相关文章目录 专栏目录 本节目标 实现刷新按钮点击 C# winform按钮可以调用C# winform代码显示到html上点击HTML按钮可以调用C# winform代码更…...

如何有效清理您的Python环境:清除Pip缓存

Python是一个广泛使用的高级编程语言&#xff0c;以其强大的库和框架而闻名。然而&#xff0c;随着时间的推移和不断安装新的包&#xff0c;Python环境可能会变得混乱不堪&#xff0c;尤其是pip缓存可能占用大量的磁盘空间。本文将向您展示如何有效地清理pip缓存&#xff0c;保…...

Jira 母公司全面停服 Server 产品,用户如何迁移至极狐GitLab

Jira 母公司即将全面停服旗下部分 Server 端产品的销售和服务支持&#xff01; Jira 母公司 Atlassian 在几年前确定了公司的战略为“全面上云”&#xff0c;为此做出了停止 Server 产品的销售和支持。整个时间线从 2021 年 2 月 2 日开始&#xff0c;直到今年 2 月 15 日&…...

Docker安装配置OnlyOffice

OnlyOffice 是一款强大的办公套件&#xff0c;你可以通过 Docker 轻松安装和部署它。本文将指导你完成安装过程。 步骤 1&#xff1a;拉取 OnlyOffice Docker 镜像 首先&#xff0c;使用以下命令从 Docker Hub 拉取 OnlyOffice Document Server 镜像&#xff1a; sudo docke…...

启动低轨道卫星LEO通讯产业与6G 3GPP NTN标准

通讯技术10年一个大跃进&#xff0c;从1990年的2G至2000年的3G网路&#xff0c;2010年的4G到近期2020年蓬勃发展的5G&#xff0c;当通讯技术迈入融合网路&#xff0c;当前的 5G 技术不仅可提供高频宽、低延迟&#xff0c;同时可针对企业与特殊需求以 5G 专网的模式提供各式服务…...

PICO Developer Center 创建和调试 ADB 命令

PICO 开发者中心概览 ADB 是一个轻量级的 Android 调试桥(Android Debug Bridge&#xff0c;简称 ADB)&#xff0c;用于与 Android 设备进行通信和调试。ADB提供了许多有用的功能&#xff0c;使开发人员能够轻松地管理和调试设备上的应用程序。 你可以使用 PDC 工具来调试系统…...

【VRTK】【PICO】如何快速创建一个用VRTK开发的PICO项目

【背景】 每次新建一个VRTK的PICO项目总是做一些重复工作,于是就想着搞成一个基本的包,把基本的设置都放进去,今后新做项目直接导这个包就行了。 完整资源包请见本篇博客的绑定资源。 【内容简介】 这个包是我为了快速开发基于VRTK的PICO应用设置的基础项目包。每次开发…...

国产操作系统:VirtualBox安装openKylin-1.0.1虚拟机并配置网络

国产操作系统&#xff1a;VirtualBox安装openKylin-1.0.1虚拟机并配置网络 openKylin 操作系统目前适配支持X86、ARM、RISC-V三个架构的个人电脑、平板电脑及教育开发板&#xff0c;可以满足绝大多数个人用户及开发者的使用需求。适用于在VirtualBox平台上安装openKylin-1.0.1…...

本地git切换地区后,无法使用ssh访问github 22端口解决方案

问题 由于放假回家&#xff0c;发现之前一直使用正常的git&#xff0c;与github无法通讯&#xff0c;pull和push都无法连接。报错如下&#xff1a; connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. 原因 可能是所…...

Chat2DB:AI赋能的多数据库客户端工具,开源领航未来数据库管理

Chat2DB&#xff1a;开源多数据库客户端的AI革新 Chat2DB使用教程:Chat2DB使用教程_哔哩哔哩_bilibili 引言&#xff1a; 随着企业数据的快速膨胀&#xff0c;数据库管理的复杂性也在增加。此时&#xff0c;一个能够跨越数据库边界、并且集成先进的AI功能的工具&#xff0c;不…...

SQL Server修改数据字段名的方法

1. ALTER TABLE语句修改 这是一种最常用的数据库更改字段的方法&#xff0c;使用Alter Table语句来更改数据库字段的名称。 一般格式如下&#xff1a; ALTER TABLE 表名 RENAME COLUMN 原字段名 TO 新字段名; 例如&#xff0c;修改字段名字段名从UserName到Uname&#xff1a;…...

Flutter编译报错Connection timed out: connect

背景&#xff1a;用Android Studo 创建了Flutter项目&#xff0c;编译运行报错java.net.ConnectException: Connection timed out: connect 我自己的环境&#xff1a; windows11 Android Studio Flutter 截图如下&#xff1a; 将错误日志展开之后&#xff1a; Exception…...

PG DBA培训26:PostgreSQL运维诊断与监控分析

本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL Diagnosis and monitoring analysis&#xff0c;学完本课程可以掌握PostgreSQL日常运维检查-风哥PGSQL工具箱&#xff0c;风哥专用PGSQL工具箱介绍&#xff0c;风哥专用PGSQL工具箱使用&…...

运维之道—生产环境安装Redis

目录 1.前言 2.环境准备 2.1 安装gcc依赖 3.部署安装 3.1 下载redis安装包 3.2 解压并编译安装redis 3.3 配置redis ​编辑3.4 启动redis并测试 4. 总结 1.前言 大家好,运维之道的系列文章继续进行,我们今天整理的是Redis生产环境的安装,Redis的安装以及生产环境的…...

人工智能数学验证工具LEAN4【入门介绍3】乘法世界-证明乘法的所有运算律

视频链接&#xff0c;创作不易记得投币哦&#xff1a; import Game.Levels.Multiplication.L08add_mul World "Multiplication" Level 9 Title "mul_assoc" namespace MyNat Introduction " We now have enough to prove that multiplication is a…...

Armv8-M的TrustZone技术简介

TrustZone技术是适用于Armv8-M的可选安全扩展,旨在为各种嵌入式应用提供改进的系统安全基础。 TrustZone技术的概念并不新鲜。该技术已经在Arm Cortex-A系列处理器上使用了几年,现在已经扩展到Armv8-M处理器。 在high level上,TrustZone技术适用于Armv8-M的概念与Arm Cort…...

ctfshow-反序列化(web267-web270)

目录 web267 web268 web269 web270 总结 web267 页面用的什么框架不知道 看源码看一下 框架就是一种软件工具&#xff0c;它提供了一些基础功能和规范&#xff0c;可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架&#xff0c;它们提供…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...