动态生成编译运行java类

本文介绍了一个使用Java实现的程序,该程序可以动态创建Java类文件,编译该类,并运行其中的方法。通过反射机制调用新创建的类中的方法。

 

package com.syj;

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Method;

public 
class CreateClass {
    private static String CLASS_NAME = "CreateClassTest
";
    private static String CLASS_FILE = CLASS_NAME + ".java
";

    public static 
void main(String args[]) {
        CreateClass mtc = 
new CreateClass();
        mtc.createClass();
        System.out.println("javac " 
+ CLASS_FILE);
        mtc.compileClass();
        System.out.println("java " 
+ CLASS_NAME);
        mtc.runClass();
    }

    public 
void createClass() {
       
try {
           
new File(CLASS_FILE).delete();
            FileWriter aWriter = new FileWriter(CLASS_FILE,
true);
            aWriter.write("public   class   " + CLASS_NAME + "{
");
            aWriter.write("public   void   println()   {
");
            aWriter.write("System.out.println("=" + CLASS_NAME + "=");
");
            aWriter.write("}}
");
            aWriter.flush();
            aWriter.close();
        }
catch (Exception e) {
            e.printStackTrace();
        }
    }

    public 
void compileClass() {
        String filePath = new File(CreateClass.
class.getClassLoader()
                .getResource(
"").getFile()).getAbsolutePath();
        String[] source = { "-d", filePath,
new String(CLASS_FILE) };
        System.out.println("javac out:
"
               
+ com.sun.tools.javac.Main.compile(source));
    }

    public 
void runClass() {
       
try {
            Class params[]
= {};
            Object paramsObj[]
= {};
            Class testClass
= Class.forName(CLASS_NAME);
            Object iClass
= testClass.newInstance();
            Method thisMethod = testClass.getDeclaredMethod("println
", params);
            thisMethod.invoke(iClass, paramsObj);
        }
catch (Exception e) {
            e.printStackTrace();
        }
    }
}

需要引入%JAVA_HOME%/lib/tools.jar;这也是我遇到的tools.jar的唯一一个用途呵呵.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值