2012-10-11 25 views
6

Tôi là người mới sử dụng trên các đại lý java. Tôi tạo ra một lớp HotswapAgent đơn giản (sniffing khỏi Play Khung!):Báo cáo Javaagent "redefineClasses không được hỗ trợ trong môi trường này"

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); 
     } 
    } 

Với manifest này:

Manifest-Version: 1.0 
Premain-Class: path.to.HotswapAgent 
Can-Redefine-Classes: true 

Và tôi cố gắng tải lại một định nghĩa lớp mới, theo cách này:

CtClass modelClass = .... 

... 

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

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

Tất cả các lớp này đều ở trong một cái bình và cuối cùng tôi nhận được lỗi này (khi gọi lại() gọi lại:

redefineClasses is not supported in this environment 

Nhưng trong kê khai được khai báo Can-Redefine-Classes: true.

JVM là Mac OS X Java 1.6 chuẩn. JVM này hoạt động tốt với JRebel, sử dụng cùng một cơ chế tác nhân.

Có vấn đề gì?

Trả lời

2

Theo documentation:

Optional Functionality: might not be implemented for all virtual machines. The following capability (as returned by GetCapabilities) must be true to use this function. 

Bạn có thể thử addCapability để kiểm tra xem có vấn đề với việc kê khai manifest.

Đây là số example of addCapability in runtime.

Các vấn đề liên quan