Java之反射爆破操作

news2024/11/29 20:50:47

一些方法

在这里插入图片描述
首先说一下-getField/Method什么的这种不带Declared只能获取到对应public的属性/方法
只有带Declared可以获取到非public的属性/方法
再看不带s和带s区别
不带s只获取对应的构造器/方法
比如说构造器
getDeclaredConstructor(int.class,String class)
就会获取不管什么修饰符,参数类型为int,String的构造器
下面具体讲解

反射爆破创建实例(构造器)

在这里插入图片描述
注意:普通的Class对象.newInstance()已经弃用
一般现在是通过Class对象获取构造器,然后用 构造器.newInstance来创建对象
说明Constructor有一个方法
就是newInstance(参数),对应的参数填写看构造器

package yuan.hsp.reflection;

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



//一些反射爆破
@SuppressWarnings({"all"})
public class reBlow {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
	//先获取User的Class对象
	Class<?> cls = User.class;
	//1.通过public无参构造实例
	User a =(User) cls.newInstance();//不过这个已经弃用了,最好不要用
	User newInstance2 = (User)cls.getDeclaredConstructor().newInstance();//现在一般用这个方法
	//先获取无参public然后newInstance
	System.out.println(newInstance2);
	//2.通过public的有参构造器创建
	Constructor<?> constructor = cls.getConstructor(String.class);
//	我们传入的参数,变成对应参数类型的Class对象,才能获取对应的构造器
	User bUser=(User) constructor.newInstance("小袁");
	System.out.println(bUser);
	//3.通过非public的有参构造器创建
	//只有带Declared的方法才可能获取到非public的,可以看博客的图片在Java之类加载中
	//先获取private的constructor
	Constructor<?> declaredConstructor = cls.getDeclaredConstructor(int.class, String.class);
	
	//注意,这里直接newInstance会报错,因为我们调用private的方法它会检测
	//所以我们之前学过一个操作,也是提高反射效率的操作
	declaredConstructor.setAccessible(true);//这个就叫做爆破,没有这句话会报错
//	这个参数是true会取消反射对象访问调查,所以我们就能在别的类用private属性/方法
	//在反射面前,一切都是纸老虎
	User cUser=(User)declaredConstructor.newInstance(1,"666");
	System.out.println(cUser);
}
}
@SuppressWarnings({"all"})
class User{
	private int age;
	private String name;
	public User() {
		
	}
	private User(int age,String name){
		this.age=age;
		this.name=name;
	}
	public User(String name){//无参public
		this.name=name;
		
	}
	@Override
	public String toString() {
		return "User [age=" + age + ", name=" + name + "]";
	}
	
}

在这里插入图片描述

所以我们的爆破就是
把Method/Field/Constructor运用setAccessible(true)方法取消访问调查来获取/修改类中非public的方法/字段/构造器
在这里插入图片描述
之前也是讲过,这个方法也会提高反射效率

反射爆破操作属性

在这里插入图片描述

package yuan.hsp.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
@SuppressWarnings({"all"})
//反射爆破属性
public class BlowField {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, NoSuchFieldException {
		//1.获取Class类
		Class<Student> student = Student.class;
		//2.创建对象
		Student newInstance = student.getDeclaredConstructor().newInstance();
		//3.使用反射得到age属性对象
		//public的可以直接修改操作
		Field field = student.getField("age");
		field.set(newInstance, 88);
		System.out.println(newInstance);
		//4.反射爆破操作name
		
		Field field2 = student.getDeclaredField("name");
		//还是如果没有取消访问调查,无论对对象进行修改操作,都会出错
		System.out.println(field2);
		
		field2.setAccessible(true);//加上这句就ok了
//		field2.set(newInstance, "小袁");//注意就静态变量的设置方式有多种1.实例对象2.null3.0
		field2.set(null, "我");
		System.out.println(newInstance);
		
		
	}
}
@SuppressWarnings({"all"})
class Student{
	public int age;
	private static String name;
	public Student(){
		
	}
	@Override
	public String toString() {
		return name+" "+age;
	}
		
}

在这里插入图片描述

反射爆破操作属性

在这里插入图片描述

package yuan.hsp.reflection;

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

//爆破方法
@SuppressWarnings({"all"})
public class BlowMeghod {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
	//获取Class对象
	Class boss = boss.class;
	//创建对象
	Object newInstance = boss.getDeclaredConstructor().newInstance();
	Method hi = boss.getDeclaredMethod("hi",String.class);//注意,如果方法有参数,在方法名后面就是参数列表对应class对象,不然获取不到
	
	//调用
	hi.invoke(newInstance, "6666");
	//爆破,调用private static方法
	Method declaredMethod = boss.getDeclaredMethod("say", int.class, String.class, char.class);
	declaredMethod.setAccessible(true);
	System.out.println(declaredMethod.invoke(null, 2,"个",'c'));//因为是private直接用会报错,要取消一下访问调查
	//null可以换成0/对象实例,因为是静态的
	
	//方法.invoke中的返回值默认都是Object打var的话,运行类型就是方法的返回类型
}
}
@SuppressWarnings({"all"})
class boss{
	public int age;
	private static String name;
	public boss() {
		
	}
	private static String say(int n,String s,char c) {
		return n+" "+s+" "+c;
	}
	public void hi(String s) {
		System.out.println("hi"+s);
	}
	
}

在这里插入图片描述

共通

一.就是修改静态属性/调用静态方法
那个对象占用的部分可以有三个值
1.实例对象2.null3.0
都可以,因为是静态的
二.getDeclared…可以获取所有修饰符修饰的
get…只能获取public修饰的
三.方法有参数的话
getDeclaredMethod(“方法名”,参数列表第一个对应class对象,参数列表第二个对应class对象,…)才能获取对应方法
四.注意用非public属性/方法/构造器
先爆破!
setAccessible(true)

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

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

相关文章

【数据分析】【Pandas】(一)如何制作频率分布直方图

文章目录概述1. 直方图2. 密度图概述 计算一组数据的分布有助于我们更好的了解数据构成&#xff0c;我们可以通过直方图或密度图&#xff0c;将离散的数据通过连续的方式展现出来。 数据分布&#xff08;频数分布&#xff09;&#xff1a;在各组按顺序排列的基础上&#xff0c…

小伍说,商业发展均是顺势而为,【字节跳动】之所以成功是因为顺应趋势,成功是必然结果!

昨天看完2021年 刘润【进化的力量】年终演讲&#xff0c;让我深刻感受到两点&#xff1a; 1、所有商业的变化&#xff0c;都是顺势而为&#xff01; 2、所有理所当然的现在&#xff0c;都是曾经不可思议的未来&#xff0c;所有现在不可思议的未来&#xff0c;可能都是明天理所…

JavaSE笔记——函数式编程(高级集合类和收集器)

文章目录前言一、方法引用二、元素顺序三、使用收集器1.转换成其他集合2.转换成值3.数据分块4.数据分组5.字符串6.组合收集器总结前言 前面介绍了集合类的部分变化&#xff0c;事实上&#xff0c;Java 8 对集合类的改进不止这些。现在是时候介绍一些高级主题了&#xff0c;包括…

LInkedList的模拟实现

在之前的文章笔者介绍了链表的实现&#xff1a;无头单向非循环链表的实现&#xff01;感兴趣的各位老铁可以点进来看看&#xff1a;https://blog.csdn.net/weixin_64308540/article/details/128397961?spm1001.2014.3001.5502对于此篇博客&#xff0c;在一写出来&#xff0c;便…

java学习day72(乐友商城)微信支付实现

今日目标&#xff1a; 会调用订单系统接口 实现订单结算功能 实现微信支付功能 1.订单系统接口 我们不做开发&#xff0c;只讲解 1.1.导入订单服务 把课前资料提供的leyou-order复制到D:\heima\code\leyou目录。 然后在工程内导入&#xff1a; 然后导入module&#xff1a…

java:责任链设计模式配合Spring@Order注解使用场景

java&#xff1a;责任链设计模式配合SpringOrder注解使用场景 1 前言 java的责任链模式&#xff0c;经典使用的场景为SpringMVC的doDispatch下&#xff0c;针对请求的过滤链式行为。实际开发场景中&#xff0c;可配合Spring的Order注解&#xff0c;定义1个有顺序的链式Compon…

我在深圳的三次工厂旅程 (一)

2019年末加入一家人工智能AI创业公司&#xff0c;由于公司涉及到智能硬件产品&#xff0c;所以有机会参与到硬件产品的整个研发测试端、产品迭代流、工厂生产序等方面的这些事情。相对于研发测试、产品迭代这些在过往的工作中经历中相对比较熟悉和接触频繁&#xff0c;在软件产…

鉴定完毕!来看看跨年晚会谁假唱了…欧莱雅智能画眉设备;首个AI律师下月出庭;推特又裁员;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 『谁在假唱』技术手段分析跨年演唱会上的歌手们 各大卫视的跨年演唱会&#xff0c;你追了几场&#xff1f;看出来了谁在对口型&#xff1f;B站Up主…

【北京理工大学-Python 数据分析-2.2Matplotlib绘制饼图、直方图、极坐标、散点图】

pyplot的基础图标函数 函数说明plt.plot(x,y,fmt,…)绘制一个坐标图plt.boxplot(data,notch,position)绘制一个箱型图plt.bar(left,height,width,bottom)绘制一个条形图plt.barh(width,bottom,left,height)绘制一个横向条形图plt.polar(theta,r)绘制极坐标图plt.psd(x,NFFT256…

Dokcer14_5:Docker Compose volumes解析、Docker Compose volumes目录路径生成规则

Dokcer14_5&#xff1a;Docker Compose volumes解析、Docker Compose volumes目录路径生成规则docker-compose volumes语法语法格式及其三种变体1.无来源 &#xff1a;匿名挂载主机系统上的目录路径2.非路径源&#xff1a;具名挂载&#xff08;常用&#xff09;主机系统上的目录…

mysql idb,frm文件复制恢复

idb是innodb数据文件frm是innodb表结构文件在数据库的data目录下可以看到 data下的目录名就是数据库名&#xff0c;打开该数据库文件夹对于一个表有2个文件&#xff0c;一个以idb结尾&#xff0c;一个以frm结尾直接复制粘贴是不识别的&#xff0c;提示找不到该表解决方法&#…

在线实习项目|Python爬虫助力疫情数据追踪在线实习项目

项目介绍 项目背景&#xff1a;2019-NCOV新型冠状病毒引发的肺炎牵动全国人民的心&#xff0c;本项目希望通过大数据技术为抗击新冠肺炎贡献一份力量。 项目目标&#xff1a;使用PYTHON爬虫技术爬取疫情数据&#xff0c;从不同维度分析数据&#xff0c;并用 MATPLOT…

ubuntu18.04部署DXSLAM,CNN+VSLAM,CPU实时运行

一、下载源代码 打开终端&#xff0c;输入命令克隆仓库 git clone https://github.com/raulmur/DXSLAM.git DXSLAM二、配置环境 We have tested the library in Ubuntu 16.04 and Ubuntu 18.04, but it should be easy to compile in other platforms. C11 or C0x CompilerPa…

虚拟化技术学习笔记8

添加网卡&#xff1a; 1、virt-manager: 选择虚拟机直接添加网卡操作。 2、virsh命令&#xff1a; virsh list virsh domiflist centos7-1 virsh attach-interface centos7-1 \ --type network \ --source default \ --model virtio \ --config 虚拟机查看网卡的添加情况&…

分享65个NET源码,总有一款适合您

NET源码 分享65个NET源码&#xff0c;总有一款适合您 65个NET源码链接&#xff1a;https://pan.baidu.com/s/19yFm_9K_L0xfykMP1hdP5A?pwdn2p7 提取码&#xff1a;n2p7 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#x…

Apache APISIX Ingress 1.6 正式发布!

距离上一个版本 v1.5 发布&#xff0c;已经过了 3 个月&#xff0c;我们很高兴地宣布 Apache APISIX Ingress v1.6 正式发布&#xff01; 在该版本中&#xff0c;共有 29 位贡献者 参与代码提交&#xff0c;其中 17 位是新晋贡献者 &#xff0c;感谢大家的支持和参与&#xff…

nacos的服务注册与调用

此篇博客进行一个简单实例进行展示服务注册和服务的调用&#xff0c;以订单与库存模块为例&#xff0c;其结构图如下&#xff1a; 目 录 1、创建订单模块与库存模块 1.1、编写stock模块 1.2、编写order模块 2、访问地址进行测试 3、总结 1、创建订单模块与库存模块 创建两…

论文投稿指南——中文核心期刊推荐(生物科学 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

.net开发安卓入门-文件操作与配置操作

.net开发安卓入门-文件操作与配置操作文件操作内部存储代码运行效果System.Environment.SpecialFolder枚举类型对应路径表格外部存储&#xff08;代码和效果见上图&#xff09;区别缓存SharedPreferences获取SharedPreferences对象方法列表读取配置信息写配置信息AssetsNlog配置…

【Linux项目自动化构建工具 make/Makefile】

目录 1 背景 2 原理 3 Linux第一个小程序&#xff0d;进度条 3.1 行缓冲区概念 3.2 进度条代码 4 总结 1 背景 在VS中我们知道当我们想要运行程序时直接按f5程序就会自动运行起来&#xff0c;但是在Linux中如果有多个文件好像并不能这样快速进行&#xff0c;那么这时候就…