跳转至
#java  #java安全  #反序列化 
本文阅读量 

反射篇3#

没有无参构造方法下的反射#

事实上,和getMethod类似,getConstructor也能接受参数,参数是构造函数列表类型,因为构造函数也支持重载, 所以我们可以用参数列表类型来确定一个构造函数。获取到构造函数后,我们使用newInstance来执行。

以ProcessBuild为例,它存在2个构造函数,我们使用第一个重载:
- public ProcessBuilder(List<String> command)
- public ProcessBuilder(String... command)

Class<?> clazz = Class.forName("java.lang.ProcessBuilder");
Object obj = clazz.getConstructor(List.class).newInstance(Arrays.asList("calc.exe")); // 第一个重载
// Object obj = clazz.getConstructor(String[].class).newInstance((Object) new String[]{"calc.exe"}); // 第二个重载
Method startMethod = clazz.getMethod("start");
startMethod.invoke(obj);

私有方法的反射#

我们可以发现getXXX系列方法是无法获取类中的私有方法/属性的,这其实涉及到了getDeclaredXXXgetXXX的区别

  • getXXX系列方法获取的是当前类及其继承类中所有的公共方法/属性
  • getDeclaredXXX系列方法获取的是当前类中所有的方法/属性

所以我们可以通过getDeclaredXXX系列方法来去反射私有方法,一个简单的示例如下

Class<?> clazz = Class.forName("java.lang.Runtime");  
Constructor<?> m = clazz.getDeclaredConstructor();  
m.setAccessible(true);  
Object obj = m.newInstance();  
Method execMethod = clazz.getMethod("exec", String.class);  
execMethod.invoke(obj, "calc.exe");

回到页面顶部