2016-06-02 8 views
0

javascist.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からあなたはこのクラスについて必要なすべてが含まれているこのメソッドを呼び出したクラスのJavassistの表現を持っていたら

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

:あなたは簡単にこのメソッドを呼び出したランタイムクラスを取得することができます。

PSあなたは本当に犬のインスタンスが必要な場合はCtClassで名前を取ってリフレクションを使用することができ、例えば:

Class clazz = Class.forName(ctc.getName()); 
Dog dog = ((Dog)clazz).newInstance(); 
関連する問題