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框架,它们提供…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
