2009-11-25 8 views
5

私は、JVMでコンパイルされたJavaの ".class"ファイルを生成する必要があるプロジェクトに取り組んでいます。JVMの.classファイルの生成

  1. Javaバイトコードにおける(C#やVB用)ILと比較して:学習と、スタックベースの中間プログラミング言語ですMSIL(マイクロソフトIL)、次の作業が終了した後の問題、私が直面していますがあります".class"ファイルには構造化された方法で情報が含まれており、ファイルを理解できる限り、プログラムデータとは別にメタデータが含まれています。私はすべてのクラスファイルのテンプレートフォームで同じを生成することはできますか?
  2. クラスファイルをバイナリで生成することは必須ですか?

私はJVm命令セットについて既に学習しているので、私は「Joshua EngelによるJava™仮想マシンのプログラミング」と言いましたが、私の目的を果たしていません。

誰でもこのことを教えてください。すべてのヘルプは高く評価されます。 単純なクラスファイルを生成する例は、1つのファイルをまだ見つけられなかったので本当に役に立ちます。

+3

の.classファイルを生成するには、どのようなコンパイラですそうです。コードの生成とコンパイルで何が問題になりますか?または.NETのReflection.EmitやDynamic IL生成のようなものです。Javaのために何をしたいですか? – OregonGhost

+0

あなたのプロジェクトはJavaコンパイラを作成していますか? –

+1

私のプロジェクトはコンパイラに似ていますが、C#.NETを使用しています。主な目的の1つは.classファイル(バイトコード)を動的に生成することです。 –

答えて

4

IKVM Java-to-.NET compilerを使用して.NETで動作するように変換:

hello.cs:

using System; 
using System.IO; 
using org.objectweb.asm; 

namespace test.helloWorld 
{ 
    public class helloDump 
    { 

     public static byte[] dump() 
     { 

      ClassWriter cw = new ClassWriter(0); 
      MethodVisitor mv; 

      cw.visit(Opcodes.__Fields.V1_6, Opcodes.__Fields.ACC_PUBLIC + Opcodes.__Fields.ACC_SUPER, "hello", null, "java/lang/Object", null); 

      mv = cw.visitMethod(Opcodes.__Fields.ACC_PUBLIC, "<init>", "()V", null, null); 
      mv.visitCode(); 
      mv.visitVarInsn(Opcodes.__Fields.ALOAD, 0); 
      mv.visitMethodInsn(Opcodes.__Fields.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); 
      mv.visitInsn(Opcodes.__Fields.RETURN); 
      mv.visitMaxs(1, 1); 
      mv.visitEnd(); 

      mv = cw.visitMethod(Opcodes.__Fields.ACC_PUBLIC + Opcodes.__Fields.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); 
      mv.visitCode(); 
      mv.visitFieldInsn(Opcodes.__Fields.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); 
      mv.visitLdcInsn("Hello World!"); 
      mv.visitMethodInsn(Opcodes.__Fields.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); 
      mv.visitInsn(Opcodes.__Fields.RETURN); 
      mv.visitMaxs(2, 1); 
      mv.visitEnd(); 

      cw.visitEnd(); 

      return cw.toByteArray(); 
     } 

     public static void Main(string[] args) 
     { 
      FileStream helloWorldFile = new FileStream("hello.class", FileMode.Create); 
      byte[] helloWorldClass = dump(); 
      helloWorldFile.Seek(0, SeekOrigin.Begin); 
      helloWorldFile.Write(helloWorldClass, 0, helloWorldClass.Length); 
     } 
    } 
} 

コマンド:

$ ikvmc -out:org.objectweb.asm.dll -target:library -version:3.2.0.0 asm-3.2.jar 
$ mcs -r:org.objectweb.asm.dll hello.cs 
$ mono hello.exe 
$ ls hello.class 
$ java hello 
+0

これは私が探していたsmthingです、thnx stobor yt again ... thnx a ton –

0

BCELを見ましたか?

http://en.wikipedia.org/wiki/Byte_Code_Engineering_Library

今ではJREにバンドルされています。

+0

ya、私はそれを見ましたが、それは私の目的を解決しません。私の問題は自分で(私のアプリケーションで)バイトコードを生成することであり、2番目のアプリケーションでは発生しないため、私は多くのことがあったかもしれません。 –

0

少なくとも単純なクラスファイルを生成するための標準的な方法です保存Simple.javaに次のコマンドラインからjavac Simple.javaを行う(あなたはJDKがインストールされていると仮定)

public class SimpleJava { 
    public static main(String[] args) { 
    System.out.println("Big Sorry, couldn't stop myself ;-)"); 
    } 
} 

;)

+0

Thnx Andreasしかし、問題は、JVM –

+0

のjavacコマンドではなく、自分のクラスファイルを生成しています(この回答は本当に重大ではありませんでした)) –

0

深刻な答え。

Javaコードを自動生成し、Javaコンパイラを使用してクラスファイルを生成します。これは、BCELと戦うのがずっと簡単です。少なくとも、Javaバイトコードよりも「高い」言語でアルゴリズムを記述する方が簡単だからです。

バイトコードを生成する他のプログラミング言語も同様ですが、私はJavaが最も簡単なアプローチの1つだと思います。

そして、あなたの質問に来て、

(1)はい、いくつかのメタデータはかなり静的です。 Wikipediaには素晴らしい概要がありますclass file format

(2)はい、クラスファイルは「バイナリ」です。 Javaバイトコードのための(アセンブラのような)は英数字言語は(少なくとも私はどのようなツールで聞いていない、てjavapは、バイトコードを読みやすく印刷することができますが、バック方法はありません)がありません

編集

まだあなたが本当にやりたいことを推測するのは難しいですが、Java仮想マシンの算術式を評価できる算術式の周りにクラスファイルを作成したいのであれば、本当にテンプレートクラスファイルの作成から始めることができます。

この場合、私はこの「評価者」をJavaでコーディングし、すべての有効な入力が評価されるまでテストします。私は、式を保持するためにプライベートフィールドを使用し、ダミー式で初期化します。

Javaのコード化されたエバリュエーターのクラスファイルは、 '動的な'クラス生成のための完全なテンプレートになるでしょう - ダミーの表現を実際のものに置き換える方法を見つけて、有効なクラスファイルを作り直してください別の文字列の長さのためにいくつかのポインタを調整するために)それは動作するはずです。

この推測が完全に間違っている場合でも、それはケーススタディとしての役割を果たすことができるとあなたの方法であなたを助けるかもしれない:)

+0

Um ...私のアプリケーションでは、プレーンテキスト、これをjava構文に変換すると、このJavaコードがコンパイルされ、JVM上で実行されなければならないので、あまりにも多くのオーバーヘッドを必要としませんか? –

+0

これらの文は、どのようなプログラミング言語から来ていますか?とにかく、あなたはクラスファイルが、とにかくjvmで動くように設計されていると思ったのですか? –

+0

彼らはどんなプログラミング言語から来ていない、ただ英語のテキスト! –

2

あなたはASMバイトコードのライブラリを見てみたいことがあります。かなり人気があります。 Clojure、Groovy、Jython、JRubyなど、多くのJVM言語で使用されています。

しかし、私はそれがの場合、Javaソースを生成し、.classファイルを取得するためにjavacをコンパイルする方が簡単であると同意します。あなたがしなければならないことにたくさん依存します。 ASM bytecode libraryを使用して

+0

これは私が推測する必要があります、thnx –

関連する問題