java动态编译加载类问题

今天看到这个http://www.infoq.com/cn/articles/cf-java-byte-code
想试一试,但是编译通过之后的,想执行结果那,总是不成功。现在将代码贴上,望大神指点!
[code="java"]
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();
}

}
}
}

[/code]

3个回答

其实编译后会生成一个class文件,关键是文件的路径有问题,所以就找不到了

加上编译选项,指定目录
[code="java"] Iterable options = Arrays.asList("-d", "bin",
"-sourcepath", "src");
CompilationTask task = compiler.getTask(null, null, diagnostics,
options, null, compilationUnits);[/code]
我项目的源代码文件在“src”目录下,生产的class文件在“bin”目录下,你依据自己情况修改。

pilgrimage_yy
pilgrimage_yy 如果能讲解一下如何设置生成的class路径就更好了
6 年多之前 回复
pilgrimage_yy
pilgrimage_yy 不好意思,采纳得有点晚了,多谢您的耐心指点!
6 年多之前 回复

[quote]method.invoke(null, new Object[] {}); [/quote]

你定义的方法没有参数吧
method.invoke(null);

pilgrimage_yy
pilgrimage_yy 你说的这个问题应该存在,但是前面的加载类还没有成功。先帮我解决一下这个问题吧
6 年多之前 回复

学习了.....

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 动态编译和加载类
import javax.tools.*; import javax.tools.JavaCompiler.CompilationTask; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java....
动态编译、加载类
package com.crnielsen.tag; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java...
java动态编译——tools.jar问题
java动态编译——tools.jar问题 笔者在学习中写了一段简单的动态编译代码,但编译一直无法通过,起初认为受路径中存在汉字影响,修改路径后仍然没有解决。最终定位错误是:Java在进行动态编译的时候需要用到tools.jar资源包,若tools.jar不存在则会出现进行编译时提示空指针异常。此包在jdk\lib目录中下,但是java在运行时使用...
关于java动态编译问题
本人最近遇到一个问题,如何用java代码来控制编译一个.java的文件,看了很多资料,要用到runtime还有JavaCompiler等类的知识,自己总结了一下总是找不到切入点。我现在想实现的效果就是编译一个.java的文件,如果编译失败则获取其失败信息。哪位大侠帮助下,不甚感激。最好有详细的代码贴出来。
Java动态编译
程序产生过程下图展示了从源代码到可运行程序的过程,正常情况下先编译(明文源码到字节码),后执行(JVM加载字节码,获得类模板,实例化,方法使用)。本文来探索下当程序已经开始执行,但在.class甚至.java还未就绪的情况下,程序如何获得指定的实现。这就是我们下面的主题,动态编译。 相关类介绍JavaCompiler: 负责读取源代码,编译诊断,输出class JavaFileObject: 文
java动态编译
要实现动态编译,要解决一下几个问题: 1. 文件编译;JavaCompiler compiler =ToolProvider.getSystemJavaCompiler(); 2. 编译后的class字节加载到内存。SimpleJavaFileObject 如果第一次被编译并初始化正常,第二次动态修改文件内容后再次编译并初始化,注意classLoader不要使用同一个实例(静态),否
Java 动态编译
一、使用 JavaCompiler 接口来编译 java 源程序(最简单的) 使用 Java API 来编译 Java 源程式有非常多方法,目前让我们来看一种最简单的方法,通过 JavaCompiler 进行编译。 我们能通过 ToolProvider 类的静态方法 getSystemJavaCompiler 来得到一个 JavaCompiler 接 口的实例。 JavaCompi...
JAVA的动态编译
动态编译的两种方式: 1.用jdk自带的javac,需用到JDK的Tools.jar JavaCompiler javac = ToolProvider.getSystemJavaCompiler(); int status = javac.run(null, null, null, "-encoding", "UTF-8", "-d", dstPath, javaFile); 编译成功返...
JAVA之动态编译
通过Java动态生成class文件 今天说下JAVA中的动态编译,这个功能根据我现在的了解好像没有见到过用的,我Jio的吧,现在的一些在线代码编缉器可以用到了,这个具体我也不是很清楚。感兴趣的大家可以自已了解下。 说到动态编缉大家可能会想到,动态编缉肯定不是像我们平时运行程序似的在本地的平台就开始编译了。 动态编译其实是在程序的运行过程中对Java文件的编译或者是运行.class的文件。比如...
java 动态编译
•JAVA 6.0引入了动态编译机制。 •动态编译的应用场景: –可以做一个浏览器端编写java代码,上传服务器编译和运行的在线评测系统。 –服务器动态加载某些类文件进行编译 •动态编译的两种做法: –通过Runtime调用javac,启动新的进程去操作 Runtime run= Runtime.getRuntime(); Processprocess= run....
动态编译java
动态编译java动态编译java动态编译java
java动态编译class,动态加载类,执行加载类的方法,直接可执行测试
直接上图上代码 public static void main(String[] args) { TestClass testClass=new TestClass(); try { //动态编译代码 JavaCompiler javac; javac = ToolProvider.get...
JAVA动态编译
Java的动态编译知识,真真在实际开发中并不是经常遇到。但是学习java动态编译有助于我们从更深一层次去了解java。对掌握jdk的动态代理模式,还有比如CGLIB,Spring 的AOP的原理就很有帮助。这样我们在学习其他一些开源框架的时候就能够知其然也知其所以然。
【Java】Java加载类机制
【Java类加载器】       JavaClassloader是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。 类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。 JVM有三种类加载器:   1.启动类加载器(Bootstrap):是在jvm启动时
java 加载类占用内存的问题?
项目中需要用到xmlbean,schame文件有200多个,生成的类大约有150m大,但是服务器上内存有限。所以领导让我确定类在加载到内存以后一般占用多大。rnrn比如有10000个类都同时load到jvm,这些类在jvm中大约多大? 会不会释放?rnrn有没有这方面的讨论?
java动态编译java源文件
java动态编译java源文件,并利用Instrumentation实现重定义class
java动态加载类和静态加载类
一.什么是动态加载类 什么是静态加载类 Class.forName 不仅表示类的类类型,还代表了动态加载类。编译时加载是静态加载类, 运行时加载是动态加载类。 请大家区分编译 运行。 二.为何要使用动态加载类 我们写了一个程序 并没有写A类和B类以及start方法  public class Main{ public static void main(String args[])
java中静态加载类与动态加载类的区别
求答案,百度,google过了,没找到答案。[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/2.gif][/img],求高人解释....
关于java动态加载类的问题
使用java的反射机制可以动态加载class文件,但是我对它有一下几个问题:rn1、如果这个class和运行的程序不在同一个目录下该如何加载?rn2、如果我想加载一个jar文件,如何导入这个jar文件中的类?
JAVA动态加载类和静态加载类
1.JAVA动态加载类和静态加载类的区别     new创建对象的方式称作为静态加载,而使用Class.forName("XXX")称作为动态加载,它们俩本质的区别在于静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序不必存在)。 2.为什么需要动态加载类    对于我自己的理解,动态加载类增加了程序的灵活性。比如一个程序中有50个功能,但你可能
动态编译的问题
是这样的我想要实现一个窗体,在运行的时候动态添加了许多控件进去,然后要把它们保存起来,以便下次使用。可是控件是不支持序列化的,所以我想用编译的方法,直接把内存里的这个窗体编译保存。应该怎么做???
动态编译问题
[code=Java]public static void main(String[] args) throws UnsupportedEncodingException rn String path=System.getProperty("user.dir") + File.separator + "configsdd"+File.separator;rn System.out.println(path);rn compileFile(path,"abcdd.java");rn rn public static int compileFile(String path, String fileName) rn System.out.println(path);rn String[] test = new String[] "-d", path, fileName ;rn System.out.println(test.toString());rn int status = Main.compile(test);rn return status;rn [/code]rnrn第一次编译的时候我用的是a.java名字(貌似是这样的),我再改名字的话(如:abcdd.java)就提示找不到abcdd.java文件。只有a.java行。求高手解决。
动态编译的问题。
我需要动态编译一段代码,去读取Dll A 里的AAClase中的一个属性。然而AA又调用了DLL B里的若干方法,然而我无法判断DLL B里是否还有别的调用,我该如何做,把需要引用的类库都引用进去?
Java虚拟机加载类
java之所以成功,很大程度上跟java的虚拟机有关系。java虚拟机是一个很神奇的东西。 java的类在通过javac这些命令编译成一些后缀为.class的二进制代码文件后,需要通过类加载器加载到Java虚拟机里才能够被使用。那么类是怎么被加载到虚拟机里去的。 java的类加载器有很多,最上面的有Bootstrap Class Loader,依次往下是Extension Class Load
java 动态加载类
java 初始化类 执行类的方法 可以初始化一个class,执行他的有参数或者无参数的方法
java加载类的时机
一个类的生命周期从加载到内存开始,卸载内存结束。包括加载、验证、准备、解析、初始化、使用、卸载七个阶段。验证、准备、解析称为连接。 一、遇到new、getstatic、putstatic、invokestatic这四条指令码时。 1、new关键字实例化一个类的时候。 2、读取或设置一个的类的静态字段的时候。限只在本类里定义的,继承父类的静态字段不算。静态常...
JAVA动态加载类
动态加载类 Class.forName(“类的全称”) 不仅表示了类的类类型,还代表了动态加载类 编译时刻加载类似静态加载类、运行时刻加载类是动态加载类 new 创建对象是静态加载类,在编译时刻就要加载所有可能用到的类 通过动态加载类可解决编译时的问题 //动态加载类,在运行时刻加载 Class c = Class.forName(args[0]); //通过类类型,创建该类对象 On
java jvm加载类
说明:        内存中存在栈、堆(放创建好的对象)、方法区(实际上也是一种特殊的堆)1.当创建一个Demo01的类会保存在JAVA类源代码上,JVM虚拟机 会创建一个class文件,首先在方法区中形成Demo01类对应的(静态变量、类方法、代码等。。。)存储信息,同时根据方法区里面的信息在堆里面也会形成java.lang.Class对象(反射对象),代表Demo01类,通过对象可以访问到类二...
Java动态加载类
在讲解动态加载类之前呢,我们先弄清楚为什么要动态加载类,静态加载不行吗?我们可以看下面的实例:我在文件夹里写了Office.java 类和 Word.java类,如下:Office.javaclass Office{ public static void main(String[] args){ if(args[0].equals(&quot;Word&quot;)){ Word w = new Word...
动态编译、加载java类
一个动态编译,加载Java类的演示。适用如动态编写算法等情况。
java动态编译执行
import java.io.BufferedInputStream; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; /* * 动态编译执行代码 */ public class Test { public static void main(String[] args) { //编译 HelloWor...
Java基础之动态编译
动态编译:运行期间编译.java文件,执行.class文件,JDK6开始已经支持动态编译了。 优点:可以动态编译执行类 缺点: 1. 性能不高   动态编译毕竟需要一个编译过程,与静态编译相比多了一个执行环节,因此在高性能项目中不要使用动态编译。不过,如果是在工具类项目中它则可以很好地发挥其优越性,比如在Eclipse工具中写一个插件,就可以很好地使用动态编译,不用重启即可实现运行、调试
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法