2011-09-29 21 views
1

an existing frameworkの仕組みを理解するために、AspectJを使用しようとしています(昨日までわかりませんでした)。 要するに、私は、フレームワークの入力XMLファイルがどのように解析されるかに興味があります。AspectJのポイントカットが外部クラスとLTWで動作しない

私は、次の側面を書かれている:

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.reflect.CodeSignature; 

public aspect UnitContextTrace { 

    static final void println(String s){ System.out.println(s); } 

    pointcut unitContextMethodsExec(): call(public * org.ivalidator.framework.test.UnitContext.* (..)) || 
    call(public void org.ivalidator.repository..*.set* (..)); 

    Object around(): unitContextMethodsExec() { 
     println("Intercepted message: " + 
       thisJoinPointStaticPart.getSignature().getName()); 
     println("in class: " + 
       thisJoinPointStaticPart.getSignature().getDeclaringType().getName()); 
     printParameters(thisJoinPoint); 
     println("Running original method: \n"); 
     Object result = proceed(); 
     println(" result: " + result); 
     return result; 
    } 

    static private void printParameters(JoinPoint jp) { 
     println("Arguments: "); 
     Object[] args = jp.getArgs(); 
     String[] names = ((CodeSignature)jp.getSignature()).getParameterNames(); 
     Class[] types = ((CodeSignature)jp.getSignature()).getParameterTypes(); 
     for (int i = 0; i < args.length; i++) { 
      println(" " + i + ". " + names[i] + 
        " : " +   types[i].getName() + 
        " = " +   args[i]); 
     } 
    } 
} 

これは、両方のUnitContextインタフェースの実装のメソッドの呼び出しとorg.ivalidator.repository.*パッケージに属するクラスのsetXXX()メソッドにそれらをデバッグする必要があります。

私は

ajc UnitContextTrace.aj -outxml -outjar aspectTrace.jar -extdirs "C:\aspectj1.6\lib\" 

を使用して、独自のジャーの中の私のアスペクトをパッケージ化して、私はJVMに-javaagent:${aspectj.home}/lib/aspectjweaver.jarを渡す(私はAntスクリプトを使用する)プログラムを開始しました。

側面(UnitContextメソッド)の最初の部分が動作し、私は例

傍受のメッセージを見ることができます:getAdapter ...

しかし残念ながらsetXXX()メソッドの呼び出しのためのログはありません。 org.ivalidator.repository.*パッケージはivalidator.jarの一部です。もちろん、libフォルダに格納されているサードパーティライブラリを使用しています。構造はこのようなものです:デバッガを使用して

  • Ivalidator.jar
  • /lib
    • Castor-0.9.7.jar
    • xercesImpl.jar

、私はsetXXX()方法は、外部のクラスから呼び出されることに気づきました(ベルongyはcastor-0.9.7.jarになりますが、それはxercesのクラスによって呼び出されます)。

かしら
**ParameterXml.setName(String) line: 60 (I want to intercept this)** 
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] 
NativeMethodAccessorImpl.invoke(Object, Object[]) line: not available 
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: not available 
Method.invoke(Object, Object...) line: not available  
FieldHandlerImpl.setValue(Object, Object) line: 501 
UnmarshalHandler.processAttribute(String, String, String, XMLFieldDescriptor, XMLClassDescriptor, Object) line: 3028  
UnmarshalHandler.processAttributes(AttributeSet, XMLClassDescriptor) line: 2702 
UnmarshalHandler.startElement(String, String, AttributeSet) line: 2325 
UnmarshalHandler.startElement(String, String, String, Attributes) line: 1388  
SAXParser(AbstractSAXParser).startElement(QName, XMLAttributes, Augmentations) line: not available 
SAXParser(AbstractXMLDocumentParser).emptyElement(QName, XMLAttributes, Augmentations) line: not available 
XMLNSDocumentScannerImpl.scanStartElement() line: not available 
XMLNSDocumentScannerImpl$NSContentDispatcher(XMLDocumentFragmentScannerImpl$FragmentContentDispatcher).dispatch(boolean) line: not available  
XMLNSDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanDocument(boolean) line: not available 
XML11Configuration.parse(boolean) line: not available 
XML11Configuration.parse(XMLInputSource) line: not available  
SAXParser(XMLParser).parse(XMLInputSource) line: not available 
SAXParser(AbstractSAXParser).parse(InputSource) line: not available 
**DescriptorRepositoryXml(XmlObject).fromXml(InputSource) line: 341 (last call within ivalidator.jar)** 

外部クラスへの呼び出し(外部のjarファイルだけでなく、すなわちorg.xml.sax.xmlreader)かどうかの問題を引き起こすことがあります。具体的には、私は、デバッガで見ることができるスタックトレースは、このですか?

+0

外部ライブラリ(私の場合、org.apache.xerces。*とorg.exolab.castor。*の両方)に属するクラスによって呼び出されたときに、問題が "ジョイントポイントをインターセプト"していることは確かですスタックトレース中)。 aspectjに、製織するときにそのようなパッケージも考慮するように指示することは可能ですか?私はaop.xml( "" Federico

答えて

1

call()を傍受したくないと思いますが、execution()です。その場合、第三者のクラスが織り込まれているかどうかは関係ありません。

関連する問題