URLClassLoader的loadClass路径问题

lyfree 发布于 2013/12/08 23:35
阅读 1K+
收藏 1

下面是我的代码:

package com.gjy.compiler;

import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Arrays;  
import javax.tools.*;  
import javax.tools.JavaCompiler.CompilationTask;
  
public class DynamicCompileTest {  
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException{  
        // 1.创建需要动态编译的代码字符串  
        String nr = "\r\n"; //回车  
        String source = "package com.compiler; " + nr +  
                "public class  Hello{" + nr +   
                "	public void test (){" + nr +   
                "		System.out.println(\"HelloWorld! 1\");" + nr +  
                "	}" + nr +  
                "}"; 
        // 2.将欲动态编译的代码写入文件中 1.创建临时目录 2.写入临时文件目录  
        File dir = new File("d:" + "/gjy/compiler"); //临时目录  
        //如果 \temp 不存在 就创建  
        if (!dir.exists()) { 
        	System.out.println("创建目录");
            dir.mkdir();  
        }
        FileWriter writer = new FileWriter(new File(dir,"Hello.java"));
        writer.write(source);  
        writer.flush();  
        writer.close();  
          
        // 3.取得当前系统的编译器  
        JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();  
        // 4.获取一个文件管理器  
        StandardJavaFileManager javaFileManager = javaCompiler.getStandardFileManager(null, null, null);  
        // 5.文件管理器根与文件连接起来  
        Iterable it = javaFileManager.getJavaFileObjects(new File(dir,"Hello.java"));  
        // 6.创建编译任务  
        CompilationTask task = javaCompiler.getTask(null, javaFileManager, null, null, null, it);  
        //CompilationTask task = javaCompiler.getTask(null, javaFileManager, null, Arrays.asList("-d", "./temp"), null, it);  
        // 7.执行编译  
        task.call();  
        javaFileManager.close();  

        URL[] urls = new URL[]{new URL("file:/"+"d:/gjy/compiler")};
        URLClassLoader ucl = new URLClassLoader(urls);
        //Class c = ucl.loadClass("com.compiler.Hello");//注释1
        Class c = ucl.loadClass("com.gjy.compiler.Hello");//注释2
        System.out.println(c);
        Hello h = (Hello) c.newInstance();
        h.test();
    }
}



为什么注释1提示找不到类,而注释2可以正常加载类。我那段动态编译的java源码中明明是写的package com.compiler;求指点



以下是问题补充:

@lyfree:我看错了,注释2用的是我eclipse中的类,所以注释2也是提示找不到类的,为什么?要怎么样才能找到类呢? (2013/12/09 11:25)
加载中
0
lyfree
lyfree
我终于明白了,是因为包的问题!呵呵!
0
b
bluescv

您好,请问一下,50行编译器直接会报错吧,没有hello类型啊。

返回顶部
顶部