java编译 类的加载_java动态编译加载类问题

今天看到这个http://www.infoq.com/cn/articles/cf-java-byte-code

想试一试,但是编译通过之后的,想执行结果那,总是不成功。现在将代码贴上,望大神指点!

package com.deep.byteOpera;

import java.io.IOException;

import java.lang.reflect.Method;

import java.net.URI;

import java.net.URISyntaxException;

import java.util.Arrays;

import javax.tools.JavaCompiler;

import javax.tools.JavaCompiler.CompilationTask;

import javax.tools.JavaFileObject;

import javax.tools.SimpleJavaFileObject;

import javax.tools.StandardJavaFileManager;

import javax.tools.ToolProvider;

public class CompilerTest {

static class StringSourceJavaObject extends SimpleJavaFileObject {

private String content = null;

public StringSourceJavaObject(String name, String content) throws URISyntaxException {

super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);

this.content = content;

}

public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {

return content;

}

}

public static void main(String[] args) throws Exception {

String className = "MainTest";

String methodName = "main";

String source = "public class "+className+" { public static String "+methodName+" () { System.out.println(\"Hello World!\"); return \"haha\";} }";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

//动态编译

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

StringSourceJavaObject sourceObject = new CompilerTest.StringSourceJavaObject(className, source);

Iterable extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);

CompilationTask task = compiler.getTask(null, fileManager, null, null, null, fileObjects);

boolean result = task.call();

System.out.println(result);

if (result) {

//编译成功,进行加载执行

// ClassLoader loader = fileManager.getClass().getClassLoader();

// ClassLoader loader = fileObjects.getClass().getClassLoader();

// ClassLoader loader = task.getClass().getClassLoader();

// ClassLoader loader = compiler.getClass().getClassLoader();

ClassLoader loader = CompilerTest.class.getClassLoader();

// ClassLoader loader = ToolProvider.getSystemToolClassLoader();

try {

Class> clazz = loader.loadClass(className);

Method method = clazz.getMethod(methodName, new Class>[] {});

Object value = method.invoke(null, new Object[] {});

System.out.println(value);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

问题补充:系统报的错误是java.lang.ClassNotFoundException: MainTest

at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:252)

at com.deep.byteOpera.CompilerTest.main(CompilerTest.java:59)

问题补充:指示的位置是Class> clazz = loader.loadClass(className);

上面提交的问题的行标不准确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值