Java安全初学之反射
前言:
复现fastjson的时候深深意识到了需要好好学习一下Java和Java安全,激情的学习了一番java安全中重要的几部分:反序列化、反射、rmi、动态代理,从反射开始做个总结。
反射:java虚拟机在运行时获取获取类的结构信息并调用其方法和属性
也就是说,反射机制和普通方式最大的区别是,普通方式(也就是我们通过正常的new对象)需要在编译时就找到和检查类的.class文件,而反射机制是在运行时做这一步骤。
反射代码举例:
import java.lang.Class;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
//构造方法为私有方法的反射调用
//类为私有 无法通过类newInstance对象 故通过getDeclaredConstructor获取私有构造方法再通过构造方法newInstance实例对象
public class reflectTest1 {
public static void main(String args[]){
try {
Class clazz = Class.forName("java.lang.Runtime");
Constructor con = clazz.getDeclaredConstructor();
con.setAccessible(true);
clazz.getMethod("exec",String.class).invoke(con.newInstance(),"calc.exe");
} catch (Exception e) {
e.printStackTrace();
} }
}
这个例子的代码如何理解呢?看一下这段反射代码中用到的几个概念
获取反射中的class对象:
在反射中,要获取类或调用一个类的方法,我们首先需要获得类的Class对象
有以下三种方式:
1. 使用Class.forName方法(也就是例子中的方法)
2. obj.getClass() 使用类对象的getClass方法
3. Class clz = test.class 这种方法是已经加载了test这个类,再通过此方法获取一个它的Class对象
通过反射创建类对象:
在反射中有两种方式创建类对象
1. 通过Class对象的newInstance方法
2. 通过Constructor对象的newInstance方法
在上个反射的例子中即是使用了Constructor对象的newInstance方法来创建对象,原因是因为使用class.newInstance方法即是调用该类的无参构造函数,而java.lang.runtime类的构造函数是私有的,故不能通过Class对象的newInstance方法创建对象
否则,编译器会报如下错误

获取类的方法、构造方法:
获取类方法:clazz.getMethod、clazz.getDeclaredMethod
这两者的区别在于getDeclaredMethod可以获取类的私有方法,除此以外它们的结构都是一样的,以getDeclaredMethod官方文档举例可知第一个参数为要获取的方法名,之后为要获取的方法的参数类型。
因为java中存在方法重载这一概念,所以我们是无法仅通过函数名来确定一个函数的,故在使用getMethod和getDeclaredMethod时我们需要传入要获取的方法的参数类型列表

获取构造方法:clazz.getConstructor、clazz.getDeclaredConstructor
其实与获取普通方法类似,因此这里就不细说了。
执行方法:
invoke():反射机制使用Method中的invoke方法来调用执行方法,举个简单例子
Method method = clazz.getMethod("setNumber", int.class);
method.invoke(object, 2);
至此,在前面举例代码中所用到的几个关键方法和概念就清晰了。
参考:
https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
phithon知识星球
Java安全初学之反射的更多相关文章
- Java类加载和类反射回顾
今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...
- 【GoLang】golang 如何像Java 一样通过类名反射对象?
结论: golang不支持解析string然后执行. golang的反射机制只能存在于已经存在的对象上面. 不知道后续的版本有没有规划,现在只能先加载注册,然后实现类似Java工厂模式的反射. 代码示 ...
- java学习:用反射构造bean
先贴一些反射的基本知识:-------------------------------------------------------------------- 一.什么是反射:反射的概念是由Smit ...
- 反射那些事儿——Java动态装载和反射技术
一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...
- Java基础学习笔记二十三 Java核心语法之反射
类加载器 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,链接,初始化三步来实现对这个类进行初始化. 加载就是指将class文件读入内存,并为之创建一个Class对象.任 ...
- Java提升篇之反射的原理
Java提升篇之反射的原理 1.构造方法的反射 import java.lang.reflect.Constructor; public class ReflectConstructor { publ ...
- Java学习:注解,反射,动态编译
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解 什么是注解 ? Annotat ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
随机推荐
- A - 你能数的清吗 51Nod - 1770
题目: 演演是个厉害的数学家,他最近又迷上了数字谜.... 他很好奇 xxx...xxx(n个x)*y 的答案中 有多少个z,x,y,z均为位数只有一位的整数. 大概解释一下: 22222*3 = ...
- python代理池的构建5——对mongodb数据库里面代理ip检查
上一篇博客地址:python代理池的构建4--mongdb数据库的增删改查 一.对数据库里面代理ip检查(proxy_test.py) #-*-coding:utf-8-*- ''' 目的:检查代理I ...
- MySQL 多实例及其主从复制
目录 Mysql 实例 Mysql 多实例 创建多实例目录 编辑配置文件 初始化多实例数据目录 授权目录 启动多实例 连接多实例并验证 Mysql 多实例设置密码 设置密码后连接 Mysql 多实例主 ...
- NIST随机数测试软件安装与使用 && igamc:UNDERFLOW
https://csrc.nist.gov/ https://csrc.nist.gov/projects/random-bit-generation/documentation-and-softwa ...
- Single Round Math sdut3260高精度除以低精度
做高精度除法,从高位开始除..高位除剩下的我们就*10扔给低一位处理,最终余数是在最低位取模得到的 高精除以高精,我们可以这么做,让除数在后面补零,刚好小于被除数,作若干次减法,减的次数加到商里面 然 ...
- SPN在域环境中的应用
0X01 SPN 服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称.Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联.如果 ...
- vue中怎么动态生成form表单
form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持3个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...
- export html to canvas image
export html to canvas image canvas.toDataURL https://developer.mozilla.org/en-US/docs/Web/API/HTMLCa ...
- Xcode show whitespace
Xcode show whitespace Xcode 11.5 how to config Xcode show whitespace 如何配置 Xcode 显示空白字符 Editor -> ...
- background & background-image & border-image
background & background-image & border-image https://developer.mozilla.org/en-US/docs/Web/CS ...