2011-10-14 14 views
7

私は以下の奇妙な要件を持っています。バイトコードを生成して.classファイルに保存するには?

私は与えられています:

  1. いくつかのメソッド名のリストを。
  2. 上記のメソッドのパラメータの名前と型。
  3. 上記の方法の機能性。これは次のとおりです。 各パラメータについて、メソッドはtoStringを使用して文字列に変換し、文字列の配列を取得します。この配列に対して、このメソッドは関数fooを適用します。関数fooは、入力としてString []タイプを取り、Stringを出力します。メソッドはfooが返すものを返します。 fooのコードはJavaオブジェクトの内部に与えられ、ブラックボックスとしてアクセスされます。

1.および2.の情報は、テキストファイルまたはXMLファイルに入れることができます。この目的のために、私たちはどのような方法であれ、Javaオブジェクト内で利用できると考えています。

タスクは、これらのメソッドを実装し、JVM上で実行できる.classファイル(バイトコード)を作成することです。

私はthis assembler libraryだと思います。誰も簡単な方法を提案することはできますか?

[編集:]私は他の方法を考えることができます:.javaファイルを生成し、それをコンパイルして.classファイルを取得します。

[コンテキスト:]私は数百もの方法でこれを行う必要があります。ショートカットが必要なので、手動でコードを書き込むのではなく、私の仕事を自動化することができます。ここで

+0

あなたはより多くの文脈を与えてください。何を達成したいのですか...一般的な動作(foo)の特定のメソッドを "作る"ことが私が見る唯一の理由は、コンパイル時に役立つ型の安全性です...生成されたコードをどのように使用/呼び出すつもりですか? – pgras

+0

私は生成されたコードを呼び出しません。私がしたいことは、誰かのためにAPIライブラリ(jar)を使用することです。クラスは特定の名前になりますので、呼び出すAPIを知ることができます。 – Jus12

+0

OK何百ものメソッドの問題を見て、メソッドのリストが頻繁に変更されるかどうか?使用している入力の例がありますか? – pgras

答えて

7

Java構文で必要なプログラムコードを生成し、コンパイラを使用してクラスファイルに変換することができます。実行時にjavacをインスタンス化し、ソースファイルの場所の代わりにバイト配列を渡すことが可能です。おそらくこれは他のプログラマーが維持するのが最も簡単です。

バイトコードを直接生成する場合は、asmが最も一般的に使用されるライブラリです。

+0

これはおそらく最も便利な方法です'.java'ファイル)。 – Jus12

+0

私は、.javaファイルを作成したと仮定して、 'javac 'を使ってこれを行う方法に関するいくつかの情報を与えることができますか? – Jus12

+1

これは 'javax.tools'パッケージに含まれています。この記事の例は、http://www.ibm.com/developerworks/java/library/j-jcomp/index.htmlです。私は自分自身で 'javax.tools' APIを使っていないことを認めなければなりません。 – Barend

1

私はあなたが私のコメントに答えて見ましたが、あなたはそれを入力:)

を今、あなたは型保証をしたい場合は、jarファイルにパッケージされるようにコードを生成したいなぜそれがまだ私のために明確ではありませんすべてのメソッドが同じ振る舞いを持つすべてのメソッドで、指定されたインターフェイスに対して動的プロキシを提供することができます(これにより、インターフェイスの生成方法に関する質問が残ります:)

すべてのMyInterfaceメソッド呼び出しメソッドで処理されます(インターフェイスにメソッドを追加してテストします)。

package test; 

import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 

public class Test { 

interface MyInterface { 

    String methodOne(String s); 

    String methodTwo(String s, Integer i); 
} 

static MyInterface proxy = (MyInterface) Proxy.newProxyInstance(
     MyInterface.class.getClassLoader(), 
     new Class[] { MyInterface.class }, new InvocationHandler() { 
      public Object invoke(Object proxy, Method method, Object[] args) 
        throws Throwable { 
       StringBuilder result = new StringBuilder(); 
       for (Object arg : args) { 
        result.append(arg.toString()); 
       } 
       return result.toString(); 
      } 
     }); 

public static void main(String[] args) { 
    System.out.println(proxy.methodOne("hello"));  
    System.out.println(proxy.methodTwo("world", 5)); 

} 

} 
+0

それを多く入力することができれば、質問をする必要はありませんでした:-)。私は主に私が入力したくないので、Scalaを使用します。 – Jus12

関連する問題