通过tool.jar动态生成类并编译加载

原创 2004年09月14日 15:34:00

jdk/lib目录下的tool.jar包含了一个完整的java编译器包,利用它可以实现类文件的运行时动态生成并且编译加载。下面是一个例子:

import java.io.*;
import java.util.*;
import java.lang.reflect.*;

public class MakeTodayClass {
  Date today = new Date();
  String todayMillis = Long.toString(today.getTime());
  String todayClass = "z_" + todayMillis;
  String todaySource = todayClass + ".java";
  
  public static void main (String args[]){
    MakeTodayClass mtc = new MakeTodayClass();
    mtc.createIt();
    if (mtc.compileIt()) {
       System.out.println("Running " + mtc.todayClass + ":/n/n");
       mtc.runIt();
       }
    else
       System.out.println(mtc.todaySource + " is bad.");
    }

  public void createIt() {
    try {
      FileWriter aWriter = new FileWriter(todaySource, true);
      aWriter.write("public class "+ todayClass + "{");
      aWriter.write(" public void doit() {");
      aWriter.write(" System.out.println(/""+todayMillis+"/");");
      aWriter.write(" }}/n");
      aWriter.flush();      
      aWriter.close();
      }
    catch(Exception e){
      e.printStackTrace();
      }
    }
  
  public boolean compileIt() {
    String [] source = { new String(todaySource)};
    ByteArrayOutputStream baos= new ByteArrayOutputStream();

    new sun.tools.javac.Main(baos,source[0]).compile(source);
    // if using JDK >= 1.3 then use
    //   public static int com.sun.tools.javac.Main.compile(source);    
    return (baos.toString().indexOf("error")==-1);
    }
    
  public void runIt() {
    try {
      Class params[] = {};
      Object paramsObj[] = {};
      Class thisClass = Class.forName(todayClass);
      Object iClass = thisClass.newInstance();
      Method thisMethod = thisClass.getDeclaredMethod("doit", params);
      thisMethod.invoke(iClass, paramsObj);
      }
    catch (Exception e) {
      e.printStackTrace();
      }
    }
 }

*****VS2008 动态库和静态库的生成和加载*****

VS2008 动态库和静态库的生成和加载   第一:动态库和静态库的生成: 1) 新建一个生成dll工程:   文件->新建->项目->Win32->Win32控制台应用程序   输入项目名...
  • lien0906
  • lien0906
  • 2014年12月02日 22:16
  • 1626

Java编译时注解自动生成代码

在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。注解处理器是一个在javac中...
  • robertcpp
  • robertcpp
  • 2016年06月16日 21:31
  • 6423

Linux下gcc编译器生成和使用静态库和动态库学习笔记

我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是...
  • arackethis
  • arackethis
  • 2015年01月31日 12:16
  • 2347

动态加载jdbc jar包连接数据库生成数据文件

  • 2016年07月19日 11:31
  • 2.7MB
  • 下载

java动态加载jar包,并运行其中的类和方法

动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。 下面通过一个实例来直观演示: ...
  • lvxinzhi
  • lvxinzhi
  • 2016年03月21日 08:26
  • 274

java动态加载jar包,并运行其中的类和方法

http://blog.csdn.net/wawmg/article/details/17961815 动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑...
  • u012506661
  • u012506661
  • 2017年03月09日 10:37
  • 570

java动态加载指定的类或者jar包反射调用其方法

序言        有时候,项目中会用到java动态加载指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大降低,更加的模块化,代码利用率更高。模式中的代理模式就用到ja...
  • oLeiChang
  • oLeiChang
  • 2015年09月22日 17:21
  • 1486

Java运行时动态加载类之ClassLoader加载class及其依赖jar包

需求场景是:通过ClassLoader动态加载外部class文件,class文件又依赖某个具体jar包,需要动态加载jar包,采用URLClassLoader。 1、xml配置文件 ...
  • fjssharpsword
  • fjssharpsword
  • 2017年03月23日 12:00
  • 3421

android动态加载jar文件中的图片

  • 2015年04月08日 19:35
  • 643KB
  • 下载

Java 动态加载jar文件示例

  • 2015年01月23日 16:12
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过tool.jar动态生成类并编译加载
举报原因:
原因补充:

(最多只允许输入30个字)