2013-05-30 103 views
1

我需要更改對象的URL,但我沒有源代碼,也沒有任何獲取和設置此對象的對象。我能夠在Eclipse調試器中看到這些值,但我沒有辦法修改它。從沒有源代碼訪問的對象獲取/設置值

變量port收到一個對象(它實現了DwsSoap接口),我沒有要訪問的源代碼。

DwsSoap port = service.getDwsSoap(); 

有這個對象,我想改叫address中的一個字段,但我不知道如何去改變它或檢索。

Debugger screenshot

爲了訪問address,我需要首先訪問h字段(如上圖所示)。這是我想做到這一點:

Object h = PropertyUtils.getProperty(port, "h"); 

但我得到一個NoSuchMethodException

java.lang.NoSuchMethodException: Unknown property 'h' 

有沒有辦法,我可以在這個變量的訪問和更改address的方法嗎?

+1

雖然你有使用反射選項要直接改變這個領域(有人已經給出了這樣的答案),你必須意識到,除非你真的確定你在做什麼,否則這可能不是一個你想要的東西。如果他們不給你二傳手等,這可能是因爲改變這個領域是不合適的。手動更改它可能會破壞該obj實例的數據的內部一致性,並可能導致不可預知的問題。 –

+0

感謝您發佈實際圖像磨坊...在我目前的代表級別,所有它允許的是我發佈鏈接。 – Shane

回答

0

最後我通過這樣的java改變端點地址的WSDL:

String sharePointDWSLocation = spDir + "_vti_bin/Dws.asmx" 
DwsSoap port = service.getDwsSoap(); 
((BindingProvider)port).getRequestContext().put(
    BindingProvider.ENDPOINT_ADDRESS_PROPERTY, sharePointDWSLocation) 
+0

讓我感覺微笑,問題*「如何通過反射破解對象?」*實際上只是*「我如何以編程方式更改jax-ws端口端點URL?」*。 –

+0

我的歉意Pavel - 我很新的Web服務。我想到可能有一些更好的方法來確定我實際想要做的事情。我剛纔以我理解的最好的方式描述了我的問題。感謝您的意見,但我會盡力在未來做得更好。 – Shane

2

您需要使用「原始」反射,而不是Spring的PropertyUtils。這是covered in the Java tutorial。該代碼將(模異常處理)看起來有點像這樣:

DwsSoap port = ...; 
Field hField = port.getClass().getField("h"); 
hField.setAccessible(true); // the field will probably be private 
Object h = hField.get(port); 
+0

_(模塊異常處理)_非常酷 –

+0

不幸的是,由於port.getClass()方法幾乎把它的所有屬性都設置爲null,所以我無法得到這個工作。字段「h」不存在,這很奇怪,因爲它可以在我上面的截圖中清楚地看到。從Web服務返回的對象顯然非常奇怪。我最終找到了下面發佈的解決方案。謝謝你張貼這個答案,但這似乎是一個非常整潔的解決方案。 – Shane

相關問題