2017-01-12 13 views
0

AOPを使用する私はJava 8とポイントカットを使用していることを知っているので、メソッドメソッドパラメータの名前をAOPで取得できるようになりました。AOPを使用して応答オブジェクトの名前を取得

私の質問は、返されるオブジェクトの名前を取得することは可能ですか?

更新 - コード例を追加:

public ExampleCategory getCategory(int categoryId){ 
     ExampleCategory category = exampleCategoryDao.read(categoryId); 
     return category; 
    } 

私はメソッドを持っていたので、もし方法

/** 
    * Log the return value of all methods in the package service.impl 
    * @param pjp 
    * @param returnValue 
    */ 
    @AfterReturning(pointcut = "execution(public * com.bla.core.service.impl.*.*(..))", returning = "returnValue") 
    public void debugAfter(JoinPoint pjp, Object returnValue) { 
     if (logger.isDebugEnabled()) { 
      logger.debug(getAuditEndMessage(pjp, returnValue)); 
     } 
    } 


    private String getAuditEndMessage(JoinPoint joinPoint, Object returnValue) { 
     String methodName = joinPoint.getSignature().getName(); 
     String className = joinPoint.getTarget().getClass().getSimpleName(); 

     //Assuming every object has the toString method overriden 
     //In reality there is more logic than this 
     String returnValueStr = String.valueOf(returnValue); 

     String returnValueObjectName = //Trying to find some way of finding this value 

     //Ex: "[End][CategoryServiceImpl][getCategory]Ouput: [category=[id=1][name=Test Category][description=Test Description]] 
     String returnStr = "[End][" + className + "][" + methodName + "]Ouput: [" + returnValueObjectName + "=" + returnValueStr + "]" 

     return returnStr; 
    } 

から返されるオブジェクトの名前をログに記録しようとしています

返されるオブジェクトの名前が出力文字列に含まれます。

[終了] [CategoryServiceImpl] [のgetCategory]出力リレー:[カテゴリ = [ID = 1] [名=テストカテゴリ] [説明=テストの説明]]

Iは、入力パラメータの名前とを得ることができます新しいJava 8の機能は、私は戻り値でこれを行う方法を知らない。

アップデート2:

このすべてを入力した後、私はこれが可能である場合、また、のような奇妙な例が​​あるかもしれないことに気づい:私はちょうど戻って、クラス名を印刷することができ

public ExampleCategory getCategory(int categoryId){ 
     return exampleCategoryDao.read(categoryId); 
    } 

そのような場合に。私はまだ私が上記で求めていることをすることが可能かどうかを知りたいです。

+1

(返される)オブジェクトには名前はなく、クラスメンバーまたはローカル変数のみが名前を持ちません。あなたのユースケースは何ですか?いくつかのコードを示して、実際に達成したいこととその理由を説明してください。 – kriegaex

+0

オブジェクトには名前がありません。あなたの尋ねるものは不明です。 – EJP

+0

私はこの考え方が少し複雑すぎると思っています。戻り値変数に 'toString()'メソッドをスラップして、それを監査ログに使用するのはなぜですか? – Brad

答えて

0

すでにthat answerで述べたように、AspectJにはローカル変数についての知識はなく、静的でないメンバー変数についての知識もありません。あなたの質問に対する答えは「いいえ」です。

たとえ可能であっても、私はローカル変数名を知る上で付加価値はありません。そこでは、AOP(クロスカッティングの問題を実装する)の概念をはるかに超え、デバッガの領域内にあります。さらに、ローカルのという概念の概念(およびその用語自体さえも)は、そのローカリティに関するものです。メソッド以外では、クラスのコントラクトの一部ではなく、実装に完全に内部的です。

ところで、アドバイス名@AfterReturningは、その目的に関するヒントです:いくつかの情報を取得し、この方法は、その結果を返した後に何かをします。結果を返す直前に、内部メソッドの状態を知りたい。

関連する問題