2016-06-02 4 views
0

Я знаю, что javassist.expr.MethodCall.getClassName() возвращает тип времени компиляции вызывающего метода, поскольку он зависит от анализа байт-кода. Мне интересно, есть ли эффективный способ получить фактический тип выполнения вызывающего метода с javassist, используя какой-то трюк или проверку кода.Использование библиотеки Javassist для обнаружения типа времени выполнения вызывающего метода

Вот простой пример, чтобы сделать вещи более ясными.

public interface Animal { 

    public void eat(); 
} 


public class Dog implements Animal { 

    @Override 
    public void eat() { 
     System.out.println("dog eating"); 
    } 

} 


public class MainClass { 

    public static void main(String[] args) {  
     Animal a = new Dog(); 
     a.eat(); 
    } 
} 

В этом примере, я хотел бы найти способ, чтобы получить «собаку» объект в качестве метода вызывающего для метода «a.eat()»

ответ

0

От javassist.expr.MethodCall вы можете легко получить класс выполнения, который назвал этот метод:

CtClass ctc = javassist.expr.MethodCall.getMethod().getDeclaringClass(); 

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

PS если вам действительно нужен экземпляр собаки вы можете использовать отражение, принимая имя по CtClass и т.д .:

Class clazz = Class.forName(ctc.getName()); 
Dog dog = ((Dog)clazz).newInstance(); 
Смежные вопросы