账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    javassist ClassFormatError
    • 2020-01-01 00:00
    • 10
    38
    0

    题目描述

    javassist生成class,添加构造方法后执行CtClass.toClass()时异常:javassist.CannotCompileException: by java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file com/example/project/BaseResponse
    查看反编译输出的.class文件,复制内容到java源文件,测试是没问题的。

    相关代码

    <!--依赖的javassist-->
    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.24.0-GA</version>
    </dependency>

    Java代码

    String classname = "com.example.project.BaseResponse";
    
    ClassPool classPool = ClassPool.getDefault();
    
    CtClass ctClass = classPool.makeClass(classname);
    
    //添加字段
    CtField resultCode = new CtField(classPool.get("java.lang.String"), "resultCode", ctClass);
    resultCode.setModifiers(Modifier.PRIVATE);
    ctClass.addField(resultCode);
    
    CtField resultMsg = new CtField(classPool.get("java.lang.String"), "resultMsg", ctClass);
    resultMsg.setModifiers(Modifier.PRIVATE);
    ctClass.addField(resultMsg);
    
    //添加字段的get、set方法
    ctClass.addMethod(CtNewMethod.setter("setResultCode", resultCode));
    ctClass.addMethod(CtNewMethod.getter("getResultCode", resultCode));
    
    ctClass.addMethod(CtNewMethod.setter("setResultMsg", resultMsg));
    ctClass.addMethod(CtNewMethod.getter("getResultMsb", resultMsg));
    
    //添加构造方法
    CtConstructor constructor = new CtConstructor(new CtClass[]{}, ctClass);
    ctClass.addConstructor(constructor);
    
    CtConstructor constructor1 = new CtConstructor(new CtClass[]{classPool.get("java.lang.String"), classPool.get("java.lang.String")}, ctClass);
    constructor1.setBody("{$0.resultCode=$1;$0.resultMsg=$2;}");
    ctClass.addConstructor(constructor1);
    
    ctClass.writeFile("gen");
    
    CtClass ctc = classPool.get(classname);
    Class clz = ctc.toClass();
    Object obj = clz.newInstance();
    
    Method setResultCode = obj.getClass().getMethod("setResultCode", new Class[]{String.class});
    setResultCode.invoke(obj, "1000");
    
    Method setResultMsg = obj.getClass().getMethod("setResultMsg", new Class[]{String.class});
    setResultMsg.invoke(obj, "succeed");
    
    Method code = obj.getClass().getMethod("getResultCode");
    System.out.println("resultCode:" + code.invoke(obj, null));
    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 云朗居士 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部