2016-06-15 50 views
1

这是一个开箱即用的问题,但我需要跟踪方法的输入并跟踪其他类中的使用位置。考虑到代码可以被重构和更改,是否有任何好的方法来做到这一点,我想确保映射保持它的准确性?跟踪调用另一个类时使用变量的位置

// doSomething is under my control 
@Endpoint("testEndpoint") 
public void doSomething(String name, int age, String surname) { 

    String fullName = name + " " + surname; 

    // SendRequest is generated code (not under my control) 
    SendRequest sr = new SendRequest(); 
    sr.setFullName(fullName); 
    sr.setUserAge(age) 
    this.sender.send(sr); 

} 

所以他们输出中可能会

testEndpoint 
    INPUT <> OUTPUT 
    --------------- 
    name -> fullName 
    age -> userAge 
    surname -> fullName 

我需要在运行此信息,并在执行方法之前。我目前的解决方案灵感来源于Dozer,它使用反射和一个自定义注释的转换类,我可以在运行时读取它们以收集依赖关系并提取此信息 - 实际上将类型安全的语言转换为类型不安全的语言。

只是想知道是否有更好的解决方案或一些库可以做到这一点。

+0

您可以使用log4j来做到这一点。并使用输出文件作为输出文件。 – Azodious

+0

但是这需要执行该方法,因此我需要这些信息。 – jax

+0

@Abodious你能详细解释一下log4j解决方案吗? – jax

回答

0

如何使用AspectJ

您可以定义一个与您想要捕获参数的方法相匹配的点切割,然后定义一个实际捕获和存储的跟踪参数值。

public aspect ExampleAspect { 

    pointcut doSomething() : call(public void doSomething(String,int,String)); 

    before(): doSomething(){ 
    System.out.println("INPUT <> OUTPUT"); 
    System.out.println("---------------"); 
    System.out.println("name -> "+ this.JoinPoint.getArgs[0]); 
    System.out.println("age -> "+ this.JoinPoint.getArgs[1]); 
    System.out.println("surname -> "+ this.JoinPoint.getArgs[2]); 
    } 

} 
+0

我确实考虑了方面,但我需要相反的信息。我不关心这些值,我想要输入名称与输出名称匹配。 – jax

+0

在我的情况下,我从REST API输出输入到WebServices API。试图追踪哪些输入会影响输出。 – jax