2017-04-25 7 views
0
How can we apply aop on the last line of main method ? 

以下は、javaの値による呼び出しのテストクラスです。 1つのインタビューで、クラスの最後の行にAspect指向プログラミングを適用するように頼まれました。任意のJavaクラスの特定の行にAOPを適用することは可能ですか?そうであれば、いくつかのコード例を挙げてください。Javaクラスの特定の行でアスペクト指向プログラミングをどのように適用できますか?

public class TestCallByValue { 

    public static void main(String[] args) { 
     Student st = new Student("Sanjeev", 1); 

     changeName(st); 

     System.out.println(st.getName());//apply aop on this line to stop printing sysout 
    } 

    public static void changeName(Student st) { 
     st = new Student("Rajeev", 2); 
     st.setName("Amit"); 
    } 

} 

class Student { 
    String name; 
    Integer id; 

    public Student(String name, Integer id) { 
     this.name = name; 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

} 

答えて

0

何Javaコードの特定の行に適用することができますすることはジョインポイント

このlinkリストあなたはAspectJので、あなたのコードで設定できる可能ジョインポイントと呼ばれています。ご覧のとおり、コンストラクタ呼び出し、メソッド呼び出し、フィールド初期化などはjoinpointsとして定義できます

唯一の方法はSystem.out#printlnにポイントカットを適用することです。 System.out.println(st.getName());を専用メソッドにカプセル化することもできます

+0

これは、特定の行にAOPを適用するために、実際の問題に答えるには助けにはなりません方法を中にカプセル化するように私の質問に答えていません。アスペクトを使用してロード時間織りを使用して行うことはできますか? –

0

AspectJはJavaプログラムの意味構造上で動作します。したがって、それは "行"の概念を持っていません。インタビュアーは、特定のメソッド呼び出しが起こらないようにする必要があり、そのメソッド呼び出しがどこにあるのかを教えてください。具体的には、mainメソッドの最後のステートメントです。

この文はTestCallByValue.main()メソッドにあり、System.outのを呼び出します。これはPrintStreamです。我々は実行からの唯一の「最後」の文を防ぎたいAspectJのに指示することはできませんが、我々は受け入れてStringとvoidを返す、

方法はPrintStreamクラスのprintlnメソッドの呼び出しにこれを絞り込むことができます、文字列の配列を受け取り、起きてからメソッド呼び出しを防ぐために、ボイド

を返すTestCallByValue.main()方法に含まれるコードの中に、あなたはを呼び出すことはありませんアドバイス周りが必要になります。また、メソッド呼び出しの対象が実際にSystem.outかどうかを確認することで、System.out.println(String)だけを防ぐことができ、println(String)ではPrintStreamの呼び出しを防ぐことができます。

の上に次の側面で達成することができます:

aspect DummyAspect { 

    pointcut printlnStatementInMain(): withincode(void TestCallByValue.main(String[])) 
     && call(void java.io.PrintStream.println(String)); 

    void around(): printlnStatementInMain() { 
     if (thisJoinPoint.getTarget() != System.out) { 
      proceed(); 
     } 
    } 

} 
関連する問題