当前位置: 首页 > 面试题库 >

使用Javassist创建类并使其可用

慎俊雄
2023-03-14
问题内容

我要执行以下操作:

try {
    Class.forName("MyClass");
} catch(ClassNotFoundException e) {
    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.makeClass("MyClass");
    Class.forName("MyClass");
}

我已经尝试过了,但是它似乎并不总是可以工作。它在一个上下文中可以工作,但是在另一个上下文中,相同的代码在第二个“ Class.forName(”
MyClass“)”上崩溃了……
cc.toClass()总是调用带来正确的课堂,并尝试过,cc.writeFile()但没有区别。不知何故,在某些情况下,第二个Class.forName找到了该类,而在其他情况下,它只是坏了……我错过了什么吗?


问题答案:

我发现我的代码是在不同的类加载器上创建类的,具体取决于我从哪里调用它。我通过执行以下操作解决了这个问题:

try {
    Class.forName("MyClass");
} catch(ClassNotFoundException e) {
    ClassPool pool = ClassPool.getDefault();
    CtClass cc = pool.makeClass("MyClass");
    cc.toClass(this.getClass().getClassLoader(), this.getClass().getProtectionDomain());
    Class.forName("MyClass");
}

toClass使用适当的Classloader
调用该方法确实成功了……我只是不确定如何控制所创建的类将在哪些classloader上可用,但是带有classloader参数的方法完全可以满足我的需求。



 类似资料:
  • 问题内容: 我正在Node.js中构建文本编辑器,用户可以在其中在textarea中创建文件。完成文件编辑后,他可以按下“导出”按钮,该按钮触发一个Jquery函数,该函数读取textarea并将文本发布到node.js服务器上。服务器应读取该信息并返回文件。我想避免在服务器上创建文件并提供服务,而是希望使用流动态创建文件。我已经尝试使用以下方法,但是没有用: 有人对如何实现这一目标有任何见识吗?

  • Javassist的API似乎允许我们创建类中声明的类初始值设定项(即静态构造函数)的精确副本: 但是,该副本还包括(公共/私有)静态最终字段。例如,以下类的静态构造函数: 事实上是: 因此,静态构造函数的精确副本也将包括对最终字段“名称”的调用。 有没有办法创建不包含对final字段的调用的静态构造函数的副本? --谢谢

  • 本文向大家介绍javassist使用指南,包括了javassist使用指南的使用技巧和注意事项,需要的朋友参考一下 Java 字节码以二进制的形式存储在 .class 文件中,每一个 .class 文件包含一个 Java 类或接口。Javaassist 就是一个用来 处理 Java 字节码的类库。它可以在一个已经编译好的类中添加新的方法,或者是修改已有的方法,并且不需要对字节码方面有深入的了解。同

  • 我在运行时使用Java辅助编辑类,(添加一个新的构造函数) 不幸的是,这会抛出一个, 线程"main"javaid中的异常。Cannot CompileExcema: byjava.lang.IllegalAccessError: classjavax.swing.JFrame无法访问其超接口javax.swing.TransferHandler$HasGetTransferHandler at

  • 问题内容: 我正在使用PHP脚本创建JSON数据。看起来像这样: 现在,如果我将其放入文件中,然后使用ajax加载它就可以了。但是,如果我从PHP脚本中请求此命令,则会得到 parsererror | 语法错误:意外的令牌非法 这是我用来从PHP加载JSON的代码: 这是PHP代码: 有任何想法吗? 问题答案: Doctypes属于HTML文档,而不是JSON。 在您的PHP文件中尝试这样的操作(

  • 问题内容: 因此,我是一名学生,正在学习Java。有一个概念让我难以把握,希望有人可以为我提供一些启示。我的问题是关于多态性。例如,假设我有以下代码。 据我了解,由于变量类型是Animal,所以a将具有Animal的所有特征。但是,由于创建的对象是蜥蜴,因此将使用Lizard类中的所有重写方法,而不是Animal类中的方法。这是正确的吗? 另外,在创建时将使用哪个类构造函数? 谢谢你的帮助。我看起