2013-01-02 168 views
1

我的问题是,我想创建一个类的执行时间(我创建一个文件.java与名称,包,方法等所有权利)。当我尝试编译和执行它时,总是加载旧版本,而不是我在执行程序期间编写的新版本。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; 
    } 
} 

而当我在aplication编辑这个,想更换解析度= 5;到res = 10;我编译但结果是5而不是10.

+0

我没有看到编译和lodaing代码在你提出什么,你是不是类使用新版本具有因存在没有。 – fatfredyy

回答

1

我不明白什么是您的临时类相关的一个有趣的博客,但是这个代码为我工作用的TestClass具有setter和一个getter。 (您需要的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()); 
} 
} 
+0

问题出在NetBeans上。我把Temp.java放在项目类路径中,然后它总是首先载入旧文件。我试图把它放在外面,然后工作正常(用你提出的代码)。谢谢 ! –

1

其实你需要使用ClassLoader来加载类。此外,如果您只是使用.java文件,则需要编译生成.class文件才能加载,然后调用构造函数来获取实例。

Here有与主题