我是javassist的新手,开始惹恼它,并得到一些工作。但是,还有很多其他的东西似乎并不奏效。用javassist创建空的构造函数(java)不能上班

我做了注入代码的方法到类 -

public static void editMethodAddEvent(CtClass target, MethodInfo method, CtClass eventClass, int start, int[] bytes, int stacksize, String constructorParameters) throws BadBytecode, NotFoundException, CannotCompileException {

target.defrost();

CodeAttribute codeAttribute = method.getCodeAttribute();

CodeIterator iterator = codeAttribute.iterator();

int classID = method.getConstPool().addClassInfo(eventClass);

int constrnatID = method.getConstPool().addNameAndTypeInfo("",constructorParameters);

int constructID = method.getConstPool().addMethodrefInfo(classID,constrnatID);

int callnatID = method.getConstPool().addNameAndTypeInfo("call","()V");

int callID = method.getConstPool().addMethodrefInfo(classID,callnatID);

iterator.insertGap(start,bytes.length);

for (int i = 0; i < bytes.length; i++) {

int byteCode = bytes[i];

if (byteCode >= 0) {

iterator.writeByte(byteCode, start+i);

} else if (byteCode == -1) {

iterator.writeByte(classID,start+i);

} else if (byteCode == -2) {

iterator.writeByte(constructID, start+i);

} else if (byteCode == -3) {

iterator.writeByte(callID, start+i);

}

}

if(stacksize > codeAttribute.getMaxStack())

codeAttribute.setMaxStack(stacksize);

target.toClass();

}

我使用此代码的字节代码添加到一个方法,触发事件是运行代码时。

当我在最后编译类(target.toClass())时,它没有错误(并且工作正常)。

但是,当我添加一个方法(在这种情况下是空的构造函数),使用下面的代码,它的错误。

public static Class addEmptyConstructor(Class clazz) throws NotFoundException, CannotCompileException {

CtClass ctClass = ClassPool.getDefault().getCtClass(clazz.getName());

ctClass.defrost();

ClassFile classFile = ctClass.getClassFile();

MethodInfo newMethod = new MethodInfo(classFile.getConstPool(), "", "()V");

newMethod.setCodeAttribute(new CodeAttribute(classFile.getConstPool(),1,1,new byte[]{0,0,0,0,0},new ExceptionTable(classFile.getConstPool())));

CodeIterator iterator = newMethod.getCodeAttribute().iterator();

iterator.writeByte(42, 0);

iterator.writeByte(183,1);

iterator.writeByte(0,2);

iterator.writeByte(1,3);

iterator.writeByte(177,4);

classFile.addMethod(newMethod);

return ClassPool.getDefault().toClass(ctClass);

}

给出的错误是:

javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "mod/TestClass"

at javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:140)

at javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:95)

at javassist.ClassPool.toClass(ClassPool.java:1143)

at javassist.ClassPool.toClass(ClassPool.java:1106)

at javassist.ClassPool.toClass(ClassPool.java:1064)

at mod.edit.MethodEdit.addEmptyConstructor(MethodEdit.java:113)

Caused by: java.lang.LinkageError: loader (instance of

sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for

name: "haven/mod/TestClass"

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClass(Unknown Source)

at java.lang.ClassLoader.defineClass(Unknown Source)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at javassist.util.proxy.DefineClassHelper.toClass3(DefineClassHelper.java:152)

at javassist.util.proxy.DefineClassHelper.toClass2(DefineClassHelper.java:134)

... 10 more

我的目标是创建一个空的构造函数,这样我可以不投入参数创建任何对象的实例。具体来说,我有很多种事件,有参数。我不想在编译时访问这个构造函数。因此,我尝试在运行时使用javassist添加构造函数,并拒绝编译。如果我简单地编辑一个方法,它不会大惊小怪,但如果我添加一个方法,它似乎拒绝做我想要的。我该如何解决这个问题?我一直在尝试超过16个小时,研究,测试不同的代码,并且无法获得任何工作。请帮忙!!!!

+0

你确定你没有添加一个空构造函数给已经有一个空的构造函数的类吗? –

+0

是的,我现在只是在某些地方调用此方法进行测试。通过字节码或简化的CtMethod或CtConstructor方法添加任何方法都会出现问题。感谢您试图帮助! –

+0

我有一个在TestClass中有参数和冗余代码的构造函数,所以编译器不会创建默认的。 –

java 空的构造函数_用javassist创建空的构造函数(java)不能上班相关推荐

  1. python创建空元组_用Python创建空元组

    python创建空元组 Python | 空元组 (Python | empty tuple) In python, we can also create a tuple without having ...

  2. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

  3. java byte 判断相等_转发收藏 | 史上最全Java面试题+面试网站推荐!(含答案)

    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次.对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦. 相关概念 面向对象的三个 ...

  4. java 文本工具类_干货:排名前16的Java工具类

    原标题:干货:排名前16的Java工具类 作者丨Java技术栈 https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Ja ...

  5. java开发工具排名_干货:排名前16的Java工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  6. Java中合法的关键词_优秀程序员必须掌握的java中50个关键字

    关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表 ...

  7. java职业发展路线图_从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析...

    http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...

  8. java局域网聊天代码_简单的局域网聊天程序(java版本的)

    局域网聊天程序,首先我已经默认你的电脑已经配置好的java开发的一些环境,所需代码有两个java的源代码,他们分别是1:Server_Test.java-------2:Socket_Test.jav ...

  9. 用java编写验证码程序_编写,验证和分析实时Java应用程序

    本文是" 用实时Java开发"系列的第三篇也是最后一部分,展示了如何设计,编写,验证和分析基本的实时应用程序. 我们将说明: 应用程序的时间和性能要求. 为什么传统的非实时Java ...

最新文章

  1. 科普丨深度学习引擎的终极形态是什么?
  2. SDN和SD-WAN有本质区别—Vecloud微云
  3. GPU---并行计算利器
  4. dcc garch matlab,如何用Eviews或者MATLAB实现DCC-garch模型?
  5. ActiveMQ objecmessage 无法调用问题。
  6. [HTTP] 跨域资源共享
  7. zookeeper配置与使用
  8. 使用Web Deploy进行远程部署
  9. 最大流最小割经典例题_最大流最小割基本
  10. Mac访问Github加速
  11. 计算机二级C语言怎么过
  12. solidworks2013安装
  13. html5 获取剪切板内容,H5剪切板功能
  14. 洛谷 P1251 餐巾计划问题 题解
  15. Navicat注释乱码
  16. 叮咚,ps术语请查收~
  17. selenium使用代理IP
  18. 2022年03月05日:宜未雨而绸缪,毋临渴而掘井
  19. 三菱梯形图转换c语言软件,三菱梯形图转51单片机软件使用程序超过100步又要使用软件的朋友.pdf...
  20. anaconda使用和入门

热门文章

  1. oracle账号密码修改后特别容易锁定_Oracle密码过期如何取消密码180天限制及过期,账号锁住的问题...
  2. 并发测试工具_性能测试工具基本工作原理及基本操作流程
  3. python数字转拼音输出_Python 将中文转拼音
  4. python绘制折线图保存_python如何画折线图
  5. 中移M5311-NBIOT-低功耗OPENCPU开发-MQTT
  6. ubuntu18.04安装wireshark3.x与tshark3.x
  7. java nextbyte()_java.util.Scanner.hasNextByte()方法实例
  8. 磁盘位置_Win10创建和附加虚拟硬盘|Win10怎么创建VHD虚拟磁盘
  9. 项目质量管理--如何保证项目的质量
  10. The type javax.xml.rpc.ServiceException cannot be resolved.It is indirectly