2011-09-29 88 views
1

我正在嘗試使用AspectJ(它直到昨天我不知道)與LTW,以瞭解an existing framework的工作原理。 簡而言之,我對如何解析框架的輸入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\" 

我在自己的罐子看點,我開始傳遞-javaagent:${aspectj.home}/lib/aspectjweaver.jar到JVM程序(我使用Ant腳本)。

方面(UnitContext方法)的第一部分的工作,我可以看到例如

截獲的信息:getAdapter ...

但遺憾的是調用setXXX()方法沒有日誌。包org.ivalidator.repository.*ivalidator.jar的一部分,它當然使用存儲在lib文件夾中的第三方庫。該結構是這樣的:

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

使用調試器,我注意到,setXXX()方法是從外部類調用(BEL鍛造到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)** 

不知是否外部類的呼叫(外部罐子也即org.xml.sax.xmlreader)可能會導致這個問題?

+0

我很確定問題是「攔截」一個連接點,當它被屬於外部庫的類調用時(在我的情況下,org.apache.xerces。*和org.exolab.castor。*出現在堆棧跟蹤中)。織造時,是否可以告訴aspectj也考慮這樣的包裝?我試圖修改aop.xml(「 Federico

回答

1

我想你不想攔截call(),但是execution()。在這種情況下,您的第三方課程是否編織並不重要。