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";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;}
}
- 创建测试类
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 如果某项操作需要很长的时间才能完成,并且不希望用户界面 (UI) 停止响应或阻塞,则可以使用 BackgroundWorker 类在另一个线程上…...

【操作系统和计网从入门到深入】(四)基础IO和文件系统
前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整性&…...

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

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

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

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

启动低轨道卫星LEO通讯产业与6G 3GPP NTN标准
通讯技术10年一个大跃进,从1990年的2G至2000年的3G网路,2010年的4G到近期2020年蓬勃发展的5G,当通讯技术迈入融合网路,当前的 5G 技术不仅可提供高频宽、低延迟,同时可针对企业与特殊需求以 5G 专网的模式提供各式服务…...

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

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

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

本地git切换地区后,无法使用ssh访问github 22端口解决方案
问题 由于放假回家,发现之前一直使用正常的git,与github无法通讯,pull和push都无法连接。报错如下: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository. 原因 可能是所…...

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

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

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

PG DBA培训26:PostgreSQL运维诊断与监控分析
本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL Diagnosis and monitoring analysis,学完本课程可以掌握PostgreSQL日常运维检查-风哥PGSQL工具箱,风哥专用PGSQL工具箱介绍,风哥专用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】乘法世界-证明乘法的所有运算律
视频链接,创作不易记得投币哦: 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 页面用的什么框架不知道 看源码看一下 框架就是一种软件工具,它提供了一些基础功能和规范,可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架,它们提供…...

决策树的分类
概念 决策树是一种树形结构 树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果 决策树的建立过程 1.特征选择:选取有较强分类能力的特征。 2.决策树生成:根据选择的特征生…...

LateX--插入伪代码类型详解
文章目录 1.算法伪代码流程图----循环带范围1.1.算法伪代码示例图11.2.算法伪代码示例图2 2.算法伪代码流程图----循环不带范围3.算法伪代码流程图---不带行数数字4.参考文献 1.算法伪代码流程图----循环带范围 #需要插入这个宏包 \usepackage[ruled,linesnumbered]{algorithm…...

《Python数据分析技术栈》第06章使用 Pandas 准备数据 04 DataFrames
04 DataFrames 《Python数据分析技术栈》第06章使用 Pandas 准备数据 04 DataFrames A DataFrame is an extension of a Series. It is a two-dimensional data structure for storing data. While the Series object contains two components - a set of values, and index …...

wayland(xdg_wm_base) + egl + opengles 最简实例
文章目录 前言一、ubuntu 下相关环境准备1. 获取 xdg_wm_base 依赖的相关文件2. 查看 ubuntu 上安装的opengles 版本3. 查看 weston 所支持的 窗口shell 接口种类二、xdg_wm_base 介绍三、egl_wayland_demo1.egl_wayland_demo2_0.c2.egl_wayland_demo3_0.c3. xdg-shell-protoco…...

MySQL部署
1、卸载mariadb rpm -qi mariadb-libs yum remove mysql-libs -y 2、查看操作系统内核版本及硬件架构 uname -a 3、查看glibc版本 ldd --version 4、下载mysql压缩包 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.35-linux-glibc2.17-x86_64.tar 5、解压到/mnt目录…...

【ARM 嵌入式 编译系列 3.7 -- newlib 库文件与存根函数 stubs 详细介绍】
请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 newlib 库文件介绍资源使用平台支持功能性能许可证兼容性系统调用函数介绍系统调用存根 stubs 详细介绍为什么需要系统调用存根(Stubs)?常见的系统调用存根如何实现系统调用存根如何告知编译器使用自定义存根…...

【C++】结构体
目录 1.结构体基本概念 2.结构体的定义和使用 3.结构体数组 4.结构体指针 5.结构体嵌套结构体 6.结构体做函数参数 7.结构体中const使用场景 1.结构体基本概念 结构体属于用户 ---- 自定义的数据类型,允许用户储存不同的数据类型 2.结构体的定义和使用 语法…...

web架构师编辑器内容-拖动元素改变元素的位置和大小的完成
拖动移动元素 改变编辑器的定位系统 我们目前的元素都是按照块级元素直接自上而下的排列在画布中,为了让元素实现精确的定位和调整,我们需要改变这些元素的定位实现。我们需要让这些元素画布区域来进行绝对定位。如果我们有一个元素有这些已经保存的 c…...

基于CNN的水果识别-含数据集训练模型
数据集介绍,下载本资源后,界面如下: 有一个文件夹一个是存放数据集的文件。 数据集介绍: 一共含有:8个类别,包含:Apple, Banana, Cherry, Dragon Fruit, Mango, Orange, Papaya, Pineapple等。 然后本地的train.txt和…...

Hadoop基本概论
目录 一、大数据概论 1.大数据的概念 2.大数据的特点 3.大数据应用场景 二、Hadoop概述 1.Hadoop定义 2.Hadoop发展历史 3.Hadoop发行版本 4.Hadoop优势 5.Hadoop1.x/2.x/3.x 6.HDFS架构 7.Yarn架构 8.MapReduce架构 9.大数据技术生态体系 一、大数据概论 1.大数…...