1

私の問題は、実行時にクラスを作成したいということです(.java名前、パッケージ、メソッドなどを含むファイルを作成します)。コンパイルして実行しようとすると、プログラムの実行中に作成した新しいバージョンではなく、常に古いバージョンがロードされます。

コードで何を変更する必要がありますか?

File f = new File("src/pfc/Temp.java");

FileWriter w = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(w);
PrintWriter wr = new PrintWriter(bw);
wr.write("package pfc;\n\npublic class Temp {\n\tpublic float getResult(float[] array){\nfloat res=0;//usar para guardar el resultado final\n");//preparamos la clase
wr.write(entrada.getText());//escribimos en el archivo
wr.write("\nreturn res;\n}\n}");
bw.flush();
bw.close();
wr.flush();
wr.close();
String fileToCompile = f.getAbsolutePath();
try {
    pfc.Temp result = new pfc.Temp();

    //Otra forma

    Class<?> c = Class.forName("pfc.Temp");
    Class[] argTypes = new Class[] { float[].class };
    Method main = c.getDeclaredMethod("getResult", argTypes);
    float nts[] = new float[model.getColumnCount()];
    for(int i = 0; i < model.getRowCount(); i++){
        System.err.println("Voy a la fila: "+i+" de "+model.getRowCount());
        for(int j = 1; j < model.getColumnCount(); j++){
            nts[j] = Float.parseFloat(model.getValueAt(i,j).toString());
            System.err.println("Notas parciales: "+nts[j]+" de la columna "+j+" sobre "+model.getColumnCount());
        }
    }
    Object comp = main.invoke(result, (Object) nts);

ありがとう !


わかりました、私はそれをよりよく説明しようとします。デスクトップ アプリケーションがあり、実行中にクラスをロードしたいと考えています。問題は、このクラスを JTextArea で変更した後、ファイルに書き込み、これをコンパイルしたいのですが、この方法では機能しません。アプリケーションを実行する前に書き込まれたファイルをコンパイルします。実行時に新しく書き込むのではありません。

ClassLoader で試してみます。Temp.java は次のようになります。

package pfc;

public class Temp {
public float getResult(float[] array){
       float res=0;//usar para guardar el resultado final
       float erer = array[1];float fdsfds = array[2];float awd = array[3];

       res= 5;
       return res;
    }
 }

そして、アプリケーションでこれを編集するときは、res= 5; を置き換えたいと思います。res= 10に。コンパイルしましたが、結果は 10 ではなく 5 です。

4

2 に答える 2

1

実際には、クラスをロードするには ClassLoader を使用する必要があります。さらに、.java ファイルのみを使用している場合は、コンパイルして .class ファイルを生成し、それをロードしてからコンストラクターを呼び出してインスタンスを取得する必要があります。

これに関連する興味深いブログがあります

于 2013-01-02T09:14:03.540 に答える
1

あなたの Temp クラスが何をしているのかわかりませんが、このコードは、セッターとゲッターを備えた TestClass で機能しました。(tools.jar が必要です。JDK ファイルパス \lib にあります)

package pfc;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ClassGenerator {

public static BufferedWriter writeClass(String dir, String className) throws IOException {
    BufferedWriter bw1 = new BufferedWriter( new FileWriter( dir + File.separator + className
            + ".java" ) );
    bw1.write( "public class " + className + " {" );
    bw1.newLine( );
    bw1.write( "  private int value;" );
    bw1.newLine( );
    bw1.write( "  public int getValue() {" );
    bw1.newLine( );
    bw1.write( "    return this.value;" );
    bw1.newLine( );
    bw1.write( "  }" );
    bw1.newLine( );
    bw1.write( "  public void setValue(int value) {" );
    bw1.newLine( );
    bw1.write( "    this.value = value;" );
    bw1.newLine( );
    bw1.write( "  }" );
    bw1.newLine( );
    bw1.write( "}" );
    bw1.newLine( );
    bw1.close( );
    return bw1;
}

public static void main(String [] args) throws IOException, ClassNotFoundException,
        NoSuchMethodException, SecurityException, InstantiationException,
        IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    String className = "TestClass";
    String dir = "bin";
    BufferedWriter bw = writeClass( dir , className );

    com.sun.tools.javac.Main.compile( new String [] { dir + File.separator + className
            + ".java" } );

    ClassLoader classLoader1 = ClassGenerator.class.getClassLoader( );
    Class clazz1 = classLoader1.loadClass( className );

    Constructor ctr1 = clazz1.getConstructor( new Class [0] );
    Object testClassInstance = ctr1.newInstance( new Object [0] );
    Method setter1 = clazz1.getMethod( "setValue" , new Class [] { int.class } );
    setter1.invoke( testClassInstance , 12 );

    Method getter1 = clazz1.getMethod( "getValue" , new Class [0] );
    Object result = getter1.invoke( testClassInstance );
    System.out.println( result.toString( ) );
}
}
于 2013-01-02T10:04:19.037 に答える