0

Javaプロジェクトでディスクからファイルを読み取ります。D:/でhohoho.javaファイルを見つけ、それがファイル形式である場合、メインクラス(Up.java)を使用して既存のパッケージにクラスとして追加したいと思います。次のようになります-パッケージ->Up.java、Hohoho.java。

もちろん、プログラムで行う必要があります。この.javaファイルとそのUp.javaの関数を使用します。

これを行う簡単な方法を知っていますか?

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;

public class Up{

public static void main(String[] args) {

    File root = new File("..\\.");
    File myfile = null;

    try {

        String[] extensions = {"java"};
        boolean recursive = true;

        Collection files = FileUtils.listFiles(root, extensions, recursive);

        for (Iterator iterator = files.iterator(); iterator.hasNext();) {
            File file = (File) iterator.next();
            String path = file.getAbsolutePath();
            System.out.println("File = " + path);

            String[] tokens = path.split("\\\\");

            for (String t : tokens)
              if (t.equals("Hohoho.java")){
                  myfile = file;
              }
            }

        System.out.println("Client class: " + myfile.getAbsolutePath());

    } catch (Exception e) {
        e.printStackTrace();
    }     

   }
}
4

2 に答える 2

1

JavaコンパイラAPIを使用して、ソースコードをバイトコードにコンパイルします。

その後、ClassLoaderを使用してコンパイル済みクラスをjvmにロードすると、そのクラスのメソッドを実行できるようになります。

確かに、そのコンパイルされたクラスは特定のインターフェイスを実装します-それをターゲットインターフェイスにキャストし、メソッドを直接呼び出すことができます-それ以外の場合-Reflectionを使用する必要があります

于 2012-11-15T11:49:03.683 に答える
1

コメントに従って、.classファイルのみをロードする必要がある場合は、次のようなものを使用できるはずです(セットアップにセキュリティの問題がないと仮定した場合)。

    String path = "/path/to/your/classfiles/root/"; //not including the package structure
    ClassLoader loader = new URLClassLoader(new URL[]{new URL("file://" + path)}, Up.class.getClassLoader());

    Class clazz = loader.loadClass("foo.Hohoho"); //assuming a package "foo" for that class
    Object loadable = clazz.newInstance();
    Field field = loadable.getClass().getField("someField");  //or whatever - (this assumes you have someField on foo.Hohoho)

    System.out.println(field.get(loadable));

(上記のすべての例外処理を削除しました)。@stemmが指摘したように、これは純粋なReflectionを使用するだけで作業するのが面倒になります。

また、VM内から可能な限り複雑でない方法でJavaコンパイラを呼び出す簡単なテストを次に示します。したがって、ソースから移動する必要がある場合は、これを基に構築できます。

    String sourcePath = "/path/to/your/javafiles/root/"; 
    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    int success = compiler.run(null, null, null,  sourcePath + "foo/Loadable.java");//can't get "-sourcepath","path" to go, for some reason.

    System.out.println("success = " + success); //should be 0; Sys err should have details, otherwise
于 2012-11-16T03:23:54.327 に答える