2012-10-31 2 views
4

Groovy를 사용하는 기존 코드가 있으므로 응용 프로그램에서 Groovy를 제거하려고합니다. 따라서 gmaven 플러그 인을 사용한 후에 생성 된 Java 소스 코드를 가져와야합니다.Groovy 생성 된 Java 소스 코드를 얻는 방법

기본적으로 다른 말로하면 (gmaven Groovy Maven 플러그 인을 사용하여) 새로운 클래스를 동적으로 생성하고 생성 된 클래스의 Java 소스 코드를 얻을 수 있기를 바랍니다.

나는 조금 연구되고있는이 플러그의 유일한 목표는 것을 알 수 있습니다

<goal>generateStubs</goal> 
<goal>compile</goal> 
<goal>generateTestStubs</goal> 
<goal>testCompile</goal> 
난 당신이 완전히 구현 자바 소스 코드를 얻을 수있는 목표, 스텁 코드를 볼 수 없습니다

Groovy를 제거하기 위해 최종 구현 소스 코드가 필요하기 때문에 우리에게는 충분하지 않습니다.

+1

내가 그루비에 익숙하지 오전하지만 그루비의 컴파일은 실제로 중간 Java 소스를 생성한다? 나는 그것을 의심한다. Groovy 컴파일이 바이트 코드에 직접 연결된다면 바이트 코드를 디 컴파일하여 해당 자바 소스로 바꿀 수 밖에 없습니다. 어쨌든, 코드 정리가 많이 필요한 프로세스를 거치지 않고 자바를 사용하여 간단하게 다시 작성하지 않는 이유는 무엇입니까? –

+0

왜 Groovy 클래스를 Java로 다시 작성하지 않는가? 빌드하고 있다면 소스 코드가 있다고 가정합니다. 이 질문은 현재의 형태로는별로 의미가 없습니다. 당신은 정교 할 수 있습니까? –

+0

Adrian, Tim 감사합니다. Adrian : 감사합니다. Adrian, 아마도 당신의 권리 일 겁니다. Tim : Groovy를 다루고 싶지 않기 때문에 최소한 저에게 질문하는 것이 좋습니다 :-). 나는 그저 그 일을 끝내기를 원하지 않는다. 그루비 코드는 유산이기 때문에 그렇게하지 않았다. 나는 그 일을 피하려고 노력하고있다. 아마 그루비 소스 코드가 자바 클래스를 생성하기 전에 자바 바이트 코드로 변환 될 것이고, 생성 된 자바 소스 코드를 Groovy에게 묻는 빠르고 쉬운 방법이 있는지 알고 싶을 것입니다. Groovy 컴파일이 자바 소스 코드를 생성하지 않는다면 디 컴파일러를 사용할 것입니다. – jhack

답변

4

저는 gmaven 플러그인에 익숙하지 않지만 Groovy 코드를 바이트 코드로 컴파일한다고 가정합니다. 이 경우 바이트 코드 디 컴파일러를 사용할 수 있습니다. 멋진 목록 here이 있습니다. 과거에는 JAD를 사용했고 꽤 좋았습니다. 또한 최상위 클래스는 클래스 이름을 기반으로 의미있는 변수 이름을 만들려고 시도합니다.

경고 - Groovy 객체는 java.lang.Object가 아닌 GObject에서 파생되므로 Groovy-> java 포팅이 완료 될 때까지 groovy jar를 유지해야 할 수 있습니다. 또한, 자바를 읽는 것은 매우 쉽지 않을 것입니다 ...

+0

감사합니다 David!, 나는 decompilers에 대해 생각했습니다. 그렇습니다. 그러나 이상하게 보였습니다./groovy가 자바 소스 코드를 얻을 수 있도록 허용하지 않습니다. – jhack

1

생성 된 스텁은 쓸모가 없습니다. 그것들은 그들의 이름이 암시하는 것입니다 : 스텁.

스텁은 공동 java/groovy 컴파일을 수행 할 때만 유용합니다. 그것은 자바/그루비 혼합 프로젝트에 두 개의 컴파일러가 관련되어 있기 때문입니다.

  1. 구문 분석 그루비
  2. 만들기 스텁
  3. 컴파일 자바와 스텁 (사용 javac의)
  4. 이 (groovyc 사용) 그루비 편집을 계속

그루비 코드가 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;} 
} 

유용한 아무것도 볼 수 있듯이 :

은 생성 된 스텁의 예입니다. 그리고 당신은 여전히 ​​그루비 라이브러리에 의존 할 것입니다.

+0

안녕 maba, 어쩌면 내 질문에 대한 미안, 미안하지만, 스텁을 얻을 수 있습니다, 네, 그냥 구현 된 자바 소스 파일을 얻을 수 없다, 그게 문제입니다. :-). 대답 해줘서 고마워 ! 건배 – jhack

1

이 질문은 얼마 전 메일 링리스트에있었습니다 [0]. 요약하기 : Groovy to 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

+0

Andre, 고마워, 그것은 복잡 해 보인다 ... 지금은 왜 그냥 그루비에서 자바 바이트 코드로 이동 ... decompiler 그들을 qith 뭔가를하려고합니다 ... 고마워요 당신의 정확한 대답. 감사합니다. 하비에르 – jhack

관련 문제