簡體   English   中英

使用Java在運行時訪問方法調用參數

[英]Accessing method call parameters at runtime in Java

我正在嘗試測試一種相當可怕的方法,該方法將其輸入參數傳遞給另一個方法修改。

它相當瑣碎,但是我想能夠測試一下,在方法過程中,第一種方法的輸入參數的值在傳遞給第二種方法之前不會被修改。

現在,我知道我可以通過將傳遞給第二種方法的值設置為類中的公共實例變量來進行此操作,然后測試該值是否等於傳遞給第一種方法的原始值。 但是,我想知道是否可以在不更改任何類代碼的情況下(完全外部)進行測試。

用抽象的術語來說,Java中是否仍存在反射(例如,反射)以在運行時檢索方法調用上的輸入參數?

編輯:盡管面向方面的編程會很棒,但我主要想知道是否可以僅使用標准Java庫實現。 我不需要任何特定的方式-我只是想知道在沼澤標准Java中是否可行。

EDIT#2:該值也不是私有設置的,所以我不能使用反射來訪問私有變量。 我應該在原始問題中這樣說。 不好意思

如果您有可能將第二類實例作為外部依賴項注入到測試對象中,則可以使用模擬框架對其進行模擬,然后捕獲傳遞給其方法的參數。

更新資料

一個簡單的例子,使用EasyMock (寫在我的頭上,不保證它可以編譯和工作):

class TestedClass {
  OtherClass other;
  public TestedClass() { ... }
  public void setOther(OtherClass other) {
    this.other = other;
  }
  public void someMethod(ParamClass param) {
    ...
    other.otherMethod(param);
    ...
  }
}

...

class TestClass {
  @Test
  public void test() {
    TestedClass tested = new TestedClass();
    ParamClass testParam = ...
    OtherClass other = createMock(OtherClass.class);
    Capture<ParamClass> capture = new Capture<ParamClass>();
    other.otherMethod(capture);
    replay(other);
    tested.setOther(other);

    tested.someMethod(testParam);

    verify(other);
    assertThat(capture.getValue(), is(testParam));
  }
}

根據您要實現的目標,您可能可以通過“ 面向方面的編程”來實現此目標。 它將允許您在方法調用之間“插入”代碼。

看起來其他人也在想同樣的事情。 :)

出於測試目的,您可以使用反射來訪問私有變量。 就像是:

Object instance = ...
Field f = instance.getClass().getDeclaredField("theVariable");
f.setAccessible(true);
Object value = f.get(instance);

根據您嘗試捕獲的調用的外觀,您可能會使用動態代理來攔截方法調用。 基於Java的方法要求您以接口為目標,否則必須使用cglib之類的第三方庫。

另一種方法是使用AoP 看看例如AspectJ項目。

您可以使用JavaSnoop之類的工具http://www.aspectsecurity.com/tools/javasnoop/攔截該調用,並對參數做任何您想做的事,或者驗證它們。

攔截在這里可能會有所幫助,但具體用法並非微不足道,並且可能會削弱您所使用的技術。 我認為最快,最直接的方法是使用guice。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM