2015-05-11 2 views
2

У меня есть класс java, который состоит из внутреннего интерфейса и планирует реализовать класс реализации во время выполнения с использованием asm-байт-кода.супер класс не присваивается классу, реализованному во время выполнения asm

package my.example; 
public class X{ 
    public static interface XInt{ 
     public void getX(); 
    } 
    //the following class that implement the interface will be defined during runtime. 
    //I put it here just to show how the implementation will look like 
    public static XImpl extend Y implements XInt{ 
     public void getX(){//implementation code} 
    } 
} 

Я уверен, что мой ASM код правильно, но дело в том, после определения класса и вызвать Class.forName («my.example.X $ XImpl»), я получаю следующее сообщение об ошибке:

> Bad <init> method call 
Exception Details: 
    Location: 
    my/example/X$XImpl.<init>()V: invokespecial 
    Reason: 
    Type 'my/other/package/Y' is not assignable to 'my/example/X$XImpl' 

Я предполагаю, что класс Y еще не доступен во время выполнения? Я понятия не имею. Любая помощь будет оценена!

EDIT: Путь я загружаю XImpl очень просто:

defineClass("my.example.X$XImpl", getXImplByte()); 
Class.forName("my.example.X$XImpl"); //fails here 

Причина, почему я уверен, мой байт-код и способ загрузки классов является правильным, потому что если я определить класс реализации без расширения любой другой класс, он будет работать нормально

+0

Не могли бы вы опубликовать, как определить и создать экземпляр экземпляра XImpl? Похоже, типичная проблема загрузки класса – qwwdfsad

+0

@qwwdfsad привет, я уже редактировал мой вопрос. Спасибо за ответ – Syenun

ответ

2

Похоже, что загрузчик классов ASM не является дочерним элементом класса X classloader, поэтому существует два разных класса (даже если они идентичны), которые нельзя отличить друг от друга.

Попробуйте использовать:

Method m = ClassLoader.getDeclaredMethods("defineClass", String.class, byte[].class, int.class, int.class); 
m.setAccessible(true); 
m.invoke(X.class.getClassLoader(), ...); 
+0

спасибо! по-видимому, у меня есть внутренняя проблема, ваш ответ дал мне очень хорошее направление. – Syenun

+0

Не могли бы вы рассказать о проблеме? Мне интересно, что еще может вызвать эту ошибку. – qwwdfsad

+1

У меня есть собственная реализация классаLoader, которая перезаписывает/расширяет некоторые функции. Все становится очень интересным, когда вы возитесь с курсом Java-класса и выполняете динамическое связывание. – Syenun

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