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: MainTestat 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文件,关键是文件的路径有问题,所以就找不到了加上编译选项,指定目录Iterable<String> options = Arrays.asList("-d", "bin","-sourcepath", "src");CompilationTask task = compiler.getTask(null, null, diagnostics,options, null, compilationUnits);我项目的源代码文件在“src”目录下,生产的class文件在“bin”目录下,你依据自己情况修改。
解决方案二:
学习了.....
解决方案三:
引用method.invoke(null, new Object[] {}); 你定义的方法没有参数吧method.invoke(null);

时间: 2024-10-28 16:28:46

java动态编译加载类问题的相关文章

Java Class类的使用 和 动态加载类

Class类 1)在面向对象的世界里,万事万物皆对象. 类是对象,类是java.lang.Class类的实例对象. There is a class named Class 2)Foo的实例对象如何表示 Foo foo1=new Foo();//foo1就表示出来了 Foo这个类也是一个实例对象,Class类的实例对象,如何表示呢? 任何一个类都是Class的实例对象,这个实例对象有三种表示方式 (1) 第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class Clas

Java 从Jar文件中动态加载类

由于开发的需要,需要根据配置动态加载类,所以简单测试了一下JAVA动态加载类 定义接口 package loader; public interface HelloIface {     public String hello();          public String sayHi(String name); } 实现接口 在其他插件类实现此接口,并导出为jar,如D:/tmp/test.jar package loader; public class HelloImpl impleme

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

反射 学习笔记之动态加载类

1 Class.forName("类的全名")不仅表示了类的类类型,还代表了动态加载类 2 编译时刻加载类称之为静态加载,运行时刻加载类是动态加载类 3 new 对象是静态加载类,在编译时刻就需要加载所有的可能使用的类(编译时刻加载) 用Edit写一个reflectDemo2,里面有俩个命令行参数判断的代码word,execl,我们在同一个文件夹下写一个word类不写execl类,我们假如只想运行word不想运行execl,但是很不幸,由于这是静态加载,javacreflectDemo

Visual Basic .NET 中动态加载类(一)

visual|动态|加载 Visual Basic .NET 中动态加载类 · ··Microsoft 摘要:理想情况下,编写软件系统之前我们就应该知道此软件系统需要完成哪些操作.但实际情况并非如此,因此我们的系统应该是可以调整的. 最能体现这种适应性的是动态集成新功能的能力.例如,在 Windows 窗体应用程序中,这种能力是指加载编译原始应用绦蚝芫靡院蟠唇ǖ拇疤宓哪芰Α?/P> 这种操作在 Microsoft Visual Basic 6.0 中几乎是不可能的,但是在 Visual Basi

Visual Basic .NET 中动态加载类 (三)

visual|动态|加载 ··Microsoft 步骤 8:用新的窗体信息更新配置文件 现在,我们已经创建了一些新窗体,还需要在配置文件中引用它们.请用以下代码行替换 FormsOnTheFly.exe.config 中的占位符信息: <add key="First Form" value="C:\NewForms\FirstForm.dll~FirstForm.Form1"></add><add key="Second Fo

ServiceLoader服务提供者模式,实现动态插件加载,类责任链模式

Edit ServiceLoader服务提供者模式,实现动态插件加载,类责任链模式 ServiceLoader的功能比ClassLoader简单,它可以帮我们获取所有实现了某接口或基类的类.当然前提是ClassLoader已经加载过的类.举个例子: 定义一个接口: public interface IService { public String sayHello(); public String getScheme(); } 以及两个实现类: public class HDFSService

动态加载类的原理——元数据的使用

动态|加载|数据 在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于"自成一体"的单元中,这个单元称为装配件.我们可以在程序运行期间访问这些信息. 在System.Reflection中有这样一个class----Assembly,我们可以通过它来加载一个装配件.方法如下: Assembly assm=Assembly.LoadFrom(fileName); 其中filename是要加载的装配件的文件名称(带路径). 接下来,我们就可以通过使用Sys

利用Java注解特性加载属性文件(properties)的值到Java类

在此之前我都是写个PropertyUtil类来加载配置文件,然后通过get方法,把key对应的值取出来. Spring提供一个PropertyPlaceholderConfigurer类,可以读取配置文件,然后在Spring配置文件通过${hibernate.dialect}这种方式注入到JavaBean中,有个不好的地方就是,要在代码中取的时候不是很方便. 然后在接触到Java注解特注解技术以后,感觉这个东东很好,hibernate映射,WebService都可以通过注解来完成,方便的很多,然