![](/img/trans.png)
[英]How the get the whole source html code of a webpage that is generated by Javascript using Java / Webdriver?
[英]How to get the Groovy generated java source code
我們有一些Groovy的遺留代碼,我們想從應用程序中刪除Groovy,因此,我們需要獲取使用gmaven插件后生成的java源代碼。
基本上,換句話說,我動態生成新類(使用gmaven Groovy maven插件),我希望能夠獲得這種生成類的java源代碼。
我研究了一下,可以看出這個插件的唯一目標是
<goal>generateStubs</goal>
<goal>compile</goal>
<goal>generateTestStubs</goal>
<goal>testCompile</goal>
我看不到任何允許你獲得完全實現的java源代碼的目標,存根代碼對我們來說還不夠,因為我們需要最終的實現源代碼才能擺脫Groovy。
我對gmaven插件不太熟悉,但我認為它將groovy代碼編譯成字節代碼。 在這種情況下,你可以使用一個字節代碼的反編譯器,有一個很好的列表在這里 。 在過去,我使用過JAD,這非常好。 最好的還會嘗試根據類名創建有意義的變量名。
雖然有一個警告 - Groovy對象是從GObject派生的,而不是java.lang.Object,所以你可能需要保持groovy jar直到groovy-> java移植完成。 另外,要做好准備,不會很容易閱讀java ...
它可能超出了你的范圍(1歲),但我遇到了同樣的問題,並找到了一種從反編譯的groovy類中檢索算法(不是java源代碼)的方法。
你可能想看看: http : //michael.laffargue.fr/blog/2013/11/02/decompiling-groovy-made-classes/
生成的存根對您來說毫無用處。 他們就是他們的名字所暗示的:存根。
存根僅在進行聯合java / groovy編譯時有用。 那是因為java / groovy混合項目中涉及兩個編譯器。
groovy代碼將使用groovyc
編譯器編譯,結果是字節代碼。
這是生成的存根的示例:
package maba.groovy;
import java.lang.*;
import java.io.*;
import java.net.*;
import java.util.*;
import groovy.lang.*;
import groovy.util.*;
@groovy.util.logging.Log4j() public class Order
extends java.lang.Object implements
groovy.lang.GroovyObject {
public groovy.lang.MetaClass getMetaClass() { return (groovy.lang.MetaClass)null;}
public void setMetaClass(groovy.lang.MetaClass mc) { }
public java.lang.Object invokeMethod(java.lang.String method, java.lang.Object arguments) { return null;}
public java.lang.Object getProperty(java.lang.String property) { return null;}
public void setProperty(java.lang.String property, java.lang.Object value) { }
public int getPrice() { return (int)0;}
public void setPrice(int value) { }
public int getQuantity() { return (int)0;}
public void setQuantity(int value) { }
@java.lang.Override() public java.lang.String toString() { return (java.lang.String)null;}
}
如你所見,沒有什么用處。 你仍然會依賴一些groovy庫。
這個問題不久前已經在郵件列表上[0]。 總結一下:Groovy到Java很難實現,因為Java中沒有語言結構和API(如果你想完全刪除Groovy依賴)。
特別是通過引入調用站點緩存和其他性能優化技術,生成的Java代碼看起來很像這樣(為了簡單起見,我只是將一些腳本放到JD-GUI [1]中):
public class script1351632333660 extends Script
{
public script1351632333660()
{
script1351632333660 this;
CallSite[] arrayOfCallSite = $getCallSiteArray();
}
public script1351632333660(Binding arg1)
{
Binding context;
CallSite[] arrayOfCallSite = $getCallSiteArray();
ScriptBytecodeAdapter.invokeMethodOnSuperN($get$$class$groovy$lang$Script(), this, "setBinding", new Object[] { context });
}
public Object run()
{
CallSite[] arrayOfCallSite = $getCallSiteArray(); Object items = ScriptBytecodeAdapter.createList(new Object[0]);
Object[] item = (Object[])ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.createList(new Object[] { "Fluff", arrayOfCallSite[1].callConstructor($get$$class$java$util$Date()), (Integer)DefaultTypeTransformation.box(11235813) }), $get$array$$class$java$lang$Object());
arrayOfCallSite[2].call(items, item);
arrayOfCallSite[3].callCurrent(this, items);
ValueRecorder localValueRecorder = new ValueRecorder();
try
{
Object tmp102_101 = items; localValueRecorder.record(tmp102_101, 8);
Object tmp126_121 = arrayOfCallSite[4].call(tmp102_101, new script1351632333660._run_closure1(this)); localValueRecorder.record(tmp126_121, 14); if (DefaultTypeTransformation.booleanUnbox(tmp126_121)) localValueRecorder.clear(); else ScriptBytecodeAdapter.assertFailed(AssertionRenderer.render("assert items.findAll { it }", localValueRecorder), null); } finally {
localValueRecorder.clear(); throw finally; } return null; return null; }
static { __$swapInit();
Long localLong1 = (Long)DefaultTypeTransformation.box(0L);
__timeStamp__239_neverHappen1351632333665 = localLong1.longValue();
Long localLong2 = (Long)DefaultTypeTransformation.box(1351632333665L);
__timeStamp = localLong2.longValue(); }
class _run_closure1 extends Closure implements GeneratedClosure { public _run_closure1(Object _thisObject) { super(_thisObject); }
public Object doCall(Object it) { CallSite[] arrayOfCallSite = $getCallSiteArray(); return it; return null;
}
// ...
[0] http://groovy.329449.n5.nabble.com/Java-lt-gt-Groovy-converters-td337442.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.