首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javaagent报告“此环境不支持redefineClasses”

Javaagent报告“此环境不支持redefineClasses”
EN

Stack Overflow用户
提问于 2012-10-12 00:23:07
回答 1查看 1.8K关注 0票数 6

我是java代理的新手。我创建了一个简单的HotswapAgent类(从Play嗅探!框架):

代码语言:javascript
复制
  public class HotswapAgent {
        static Instrumentation instrumentation;
        public static boolean enabled = false;

        public static void premain(String agentArgs, Instrumentation instrumentation) 
        {
             HotswapAgent.instrumentation = instrumentation;
             HotswapAgent.enabled = true;
        }

        public static void reload(ClassDefinition... definitions) 
                             throws UnmodifiableClassException, ClassNotFoundException                         
        {
            instrumentation.redefineClasses(definitions);
        }
    } 

有了这个清单:

代码语言:javascript
复制
Manifest-Version: 1.0
Premain-Class: path.to.HotswapAgent
Can-Redefine-Classes: true

我尝试以这种方式重新加载一个新的类定义:

代码语言:javascript
复制
CtClass modelClass = .... 

...

byte [] bcode = modelClass.toBytecode();
Class c = modelClass.toClass();
modelClass.defrost();

ClassDefinition cdef = new ClassDefinition(c, bcode);
HotswapAgent.reload(cdef);

所有这些类都在一个jar中,最后我得到了这个错误(在调用reload()时):

代码语言:javascript
复制
redefineClasses is not supported in this environment

但是在Manifest中声明为Can-Redefine-Classes: true

JVM是标准的MacOS X Java1.6VM。这个JVM可以很好地与使用相同代理机制的JRebel一起工作。

怎么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 17:05:35

根据documentation的说法

代码语言:javascript
复制
Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function.

您可以尝试使用addCapability来检查清单声明是否有问题。

这是一个example of addCapability in runtime

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12844186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档