Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java附加API的限制和范围_Java_Jvm_Classloader_Bytecode - Fatal编程技术网

Java附加API的限制和范围

Java附加API的限制和范围,java,jvm,classloader,bytecode,Java,Jvm,Classloader,Bytecode,据我所知,Java 6中引入的Attach API允许通过代理对目标JVM中运行的类进行进程间修改。我的问题是: 此策略是否仅限于目标JVM尚未加载的类的插装?及 这些转换的限制是什么?。例如,只能修改现有方法的主体,或者可以更改类定义中的所有内容 您可以通过使用ClassFileTransformer截取已加载或将要加载的两个类来插入指令。但是,如果重新传输的方法具有活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。重新转换的方法将用于新的调用 重新定义/重新传输可能会更改方法体、常量池和属

据我所知,Java 6中引入的Attach API允许通过代理对目标JVM中运行的类进行进程间修改。我的问题是:

  • 此策略是否仅限于目标JVM尚未加载的类的插装?及
  • 这些转换的限制是什么?。例如,只能修改现有方法的主体,或者可以更改类定义中的所有内容
  • 您可以通过使用
    ClassFileTransformer
    截取已加载或将要加载的两个类来插入指令。但是,如果重新传输的方法具有活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。重新转换的方法将用于新的调用
  • 重新定义/重新传输可能会更改方法体、常量池和属性。重新定义/重新传输不得添加、删除或重命名字段或方法、更改方法的签名或更改继承。这些限制可能会在未来的版本中取消。在应用转换之前,不会检查、验证和安装类文件字节,如果生成的字节出错,此方法将引发异常

  • 接口的javadoc包含了您询问的大部分信息。

    我明白了。这是一个小问题,它不允许添加新方法。我想尝试向类定义添加一个新接口,但如果不可能添加方法,这将不起作用:(.你认为我应该能够为现有的抽象方法提供某种实现,并将类从抽象更改为非抽象吗?这是可能的,但我不知道你打算如何使用它。如果它是抽象类,你必须在某处创建它的实例。如果你正在创建实例你总是可以动态生成一个扩展抽象类的类。你可以有一个自定义类加载器来加载新类的字节。不需要更改原始的。hi@jdb,这正是我现在正在做的(使用Javassist),但是很难与其他框架(如Hibernate)交互使用扩展原始抽象类的技术(假设我的库和Hibernate都希望为同一组类提供工具)。因此,我的问题是如何修改原始类。不幸的是,无法向该类添加新方法对我来说是一个很大的限制,因此Attach API看起来仍然不是完美的解决方案:(对于某些JVM,您可以为本机方法提供实现(通过重命名原始方法)。如果抽象的东西不起作用,您可以试试。它可能有更多的限制,但值得一提。
    Instrumentation#setNativeMethodPrefix
    。谢谢,如果您对此有什么好的建议,请告诉我。