2016-08-04 11 views
0

Я работаю над java-агентом для моего личного проекта и столкнулся с действительно необычной ошибкой. Когда я запускаю метод «зарегистрировать» в моей IDE, он отлично работает. Ошибка округления. Но когда я экспортирую агент и использую его с аргументами запуска javaagent:"agent.jar", он сбрасывает, выдавая ClassCircularityError (иерархия суперкласса петли).ClassCircularityError, когда иерархия суперкласса в норме

public class Refactorer implements ClassFileTransformer { 
    private static final Set<AbstractMatcher<String>> matchers = new HashSet<AbstractMatcher<String>>(); 

    public static void register(AbstractMatcher<String> matcher) { 
     matchers.add(matcher); 
    } 

    public byte[] transform(ClassLoader loader, String name, Class<?> clazz, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {} 
} 

StackTrace

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386) 
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401) 
Caused by: java.lang.ClassCircularityError: java/util/Set 
    at me.vader.Refactorer.register(Refactorer.java:42) 
    at me.vader.Setup.registerModders(Setup.java:30) 
    at me.vader.Agent.setAndAddTransformer(Agent.java:37) 
    at me.vader.Agent.premain(Agent.java:18) 

Что действительно смущает меня то, что, когда я проверил суперкласса иерархии в компилируемый агента он распечатывается нормально.

Протестировано:

Class c = matchers.getClass(); 
int i = 0; 
while (c != null){ 
    System.out.println("Class (Sup x" + i+ "): " + c.getName()); 
    c = c.getSuperclass(); 
    i++; 
} 

i = 0; 
c = matcher.getClass(); 
while (c != null){ 
    System.out.println("Class (Sup x" + i+ "): " + c.getName()); 
    c = c.getSuperclass(); 
    i++; 
} 

который выводит:

// The "matchers" 
Class (Sup x0): java.util.HashSet 
Class (Sup x1): java.util.AbstractSet 
Class (Sup x2): java.util.AbstractCollection 
Class (Sup x3): java.lang.Object 

// The matcher being added to "matchers" 
Class (Sup x0): me.vader.match.ClassMatcher 
Class (Sup x1): me.vader.match.AbstractMatcher 
Class (Sup x2): java.lang.Object 

ответ

0

Кажется, что классы были не загружены в правильном порядке. Я не уверен, почему, но это похоже.

Мой исправление хлопая folllowing в классе Refactorer:

static { 
    Serializable.class.getName(); 
    Cloneable.class.getName(); 
    Iterable .class.getName(); 
    Collection.class.getName(); 
    AbstractCollection.class.getName(); 
    Set.class.getName(); 
    AbstractSet.class.getName(); 
    HashSet.class.getName(); 
} 

Заставлять их для загрузки в правильном порядке. Это уродливо, но оно работает.

 Смежные вопросы

  • Нет связанных вопросов^_^