簡體   English   中英

如何獲取Groovy生成的java源代碼

[英]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混合項目中涉及兩個編譯器。

  1. 解析時髦
  2. 創建存根
  3. 編譯java和stubs(使用javac)
  4. 繼續groovy編譯(使用groovyc)

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

[1] http://java.decompiler.free.fr

暫無
暫無

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

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