私は十分に難しいと思っていないかもしれませんし、答えが本当に分かりにくいかもしれません。クイックシナリオ(コードを試してみるとコンパイルされます)。CGLIBがスーパークラス/スーパーインターフェースのメソッドをインターセプトできない
今、私はこの野心的な人として来て、「新規」システムのためのクラスを書き込み
public abstract class LegacyClassNoCodeAvailable implements LegacyInterfaceNoCodeAvailable{
public abstract void executeSomething();
public void rockItOldSchool(){
logInfo("bustin' chops, old-school style");
}
@Override
public void logInfo(String message){
System.out.println(message);
}
}
上のインターフェイスのレガシー実装を検討し、レガシーインタフェース
public interface LegacyInterfaceNoCodeAvailable{
void logInfo(String message);
}
を考えるが、それは 'レガシー'フレームワークの中で動くので、私はレガシーベースクラスを拡張する必要があります。
public class lass SpankingShiny extends LegacyClassNoCodeAvailable{
public void executeSomething(){
rockItOldSchool();
logInfo("I'm the King around here now");
System.out.println("this new stuff rocks!!");
}
}
すべては、あなたが期待するだけのように、素晴らしい作品:
SpankingShiny shiny = new SpankingShiny();
shiny.executeSomething();
上記のコード利回り(予想通り):
bustin' chops, old-school style
I'm the King around here now
this new stuff rocks!!
今、あなたが見ることができるよう、「システム。 out.println() 'は、忠実に出力を出力します。しかし、私は 'System.out.println()'をロガーに置き換えたいと思います。
は問題:私は「LOGINFO(文字列)」へのメソッドインターセプトCGLIBプロキシを持つことができないことだし、それはロガーを通じて私の希望のメッセージをプリントアウトしてい
(私は右のロギングコンフィギュレーションを行っています方法)。そのメソッド呼び出しは、明らかにプロキシにヒットしません。
コード:
public class SpankingShinyProxy implements MethodInterceptor{
private SpankingShiny realShiny;
private final Logger logger = Logger.getLogger(SpankingShinyProxy.class);
public SpankingShinyProxy(SpankingShiny realShiny) {
super();
this.realShiny = realShiny;
}
@Override
public Object intercept(Object proxyObj, Method proxyMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
String methodName = proxyMethod.getName();
if("logInfo".equals(methodName)){
logger.info(methodParams[0]);
}
return proxyMethod.invoke(realShiny, methodParams);
}
public static SpankingShiny createProxy(SpankingShiny realObj){
Enhancer e = new Enhancer();
e.setSuperclass(realObj.getClass());
e.setCallback(new SpankingShinyProxy(realObj));
SpankingShiny proxifiedObj = (SpankingShiny) e.create();
return proxifiedObj;
}
}
主な方法:
public static void main(String... args) {
SpankingShiny shiny = new SpankingShiny();
shiny.executeSomething();
SpankingShiny shinyO = SpankingShinyProxy.createProxy(shiny);
shinyO.executeSomething();
}
上記のコード利回り(期待できないように):
bustin' chops, old-school style
I'm the King around here now
this new stuff rocks!!
bustin' chops, old-school style
I'm the King around here now
this new stuff rocks!!
私は間違って行くことでしょうか?
ありがとうございます!