2011-09-29 91 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()。在这种情况下,您的第三方课程是否编织并不重要。