2011-01-14 14 views
1

私はjava.util.concurrencyフレームワークをはじめて使用しています。ここに私がやっていることの非常に単純化されたバージョンがあります。フレームワークに精通していない人にとっては、future.get()は将来定義されるCallableオブジェクトを実行します。 future.getOriginatingRequest()は、私がCallableオブジェクトで使用するために将来設定したオブジェクトを返します。元の要求オブジェクトが失敗した(そのクラス名を知るのに十分な)ログを記録しようとしています。プロキシクラスの名前を取得する方法は?

try { 
    future.get(); 
} catch (ExecutionException e) { 
    logger.error("Failed to execute future with id '" + 
      future.getOriginatingRequest().getClass().getName() + "'"); 
} 

私がいる問題は、ロギングフレームワークがこれを出力しているということである。したがって、代わりに私は$Proxy22または他のいくつかの番号を取得しています実際のクラス名の

Failed to execute future with id '$Proxy22' 

。プロキシ名ではなく、実際のクラス名を取得する方法はありますか?ボーナスポイントは、なぜ私が最初にプロキシ文字列を取得しているのかを誰かが明確に説明できることです!

答えて

2

私はボーナスの質問に答えることができます。文字列は、実行時に生成される動的Proxyクラスの名前です。

マスクされたクラスに到達する方法については、まったく存在するという保証さえありません。プロキシオブジェクトのProxy.getInvocationHandler()に電話するだけで、呼び出しハンドラがより多くの情報を表示することが期待されます(恐らく価値があるかもしれませんが)。

+0

おかげで私ソリューションのために良い見つけます。なぜプロキシクラスが関与しているのでしょうか?それらは何のため?結局のところ、私は自分自身を作成し​​た将来的に元のリクエストオブジェクトを設定し、それを元に戻そうとしています。 –

+0

@Chris Knight RMIなどを使用していますか? – josefx

+0

@Chris Knightプロキシの使用にはいくつかの理由がありますが、通常は、すべてのメソッド呼び出しの前および/または後に実行されるアクション(たとえばアクセスチェックなど)または操作(または置換)それに気づいていない誰もが基本的なオブジェクト。しかし、動的プロキシは非常に強力で汎用性があり、全く異なるものになる可能性があります。 – biziclop

-1

私はプロキシクラスがあなたが探しているクラスのサブクラスだと思います。特にあなたが探しているクラスがあなたが書いたクラスであるならば。

あなたが見つけたオブジェクトの継承ツリーにアクセスできますか?多分リフレクションを通して?

+0

他にも、この種の改ざんを防ぐために動的プロキシが使用されています。 – biziclop

+0

ええと、多分そうではありません。とにかく、ここではstackoverflow Dを推測することです: – davogotland

+0

良い考え(私は思う)が、私のために働いていない:ここに私の出力です:クラス:$ Proxy22 スーパークラス:java.lang.reflect.Proxy スーパースーパークラス:java .lang.Object –

1

は私がhttp://www.techper.net/2009/06/05/how-to-acess-target-object-behind-a-spring-proxy/

@SuppressWarnings({"unchecked"}) 
protected <T> T getTargetObject(Object proxy, Class<T> targetClass) throws Exception { 
    if (AopUtils.isJdkDynamicProxy(proxy)) { 
    return (T) ((Advised)proxy).getTargetSource().getTarget(); 
    } else { 
    return (T) proxy; // expected to be cglib proxy then, which is simply a specialized class 
    } 
} 

使用

@Override 
protected void onSetUp() throws Exception { 
    getTargetObject(fooBean, FooBeanImpl.class).setBarRepository(new MyStubBarRepository()); 
} 
関連する問題