动态生成编译运行java类

这篇博客分享了一段代码,可以动态地生成、编译及运行Java类。这个方法源于作者的学习笔记,最初由论坛网友路人甲提供。实现过程包括生成Java文件、编译文件以及执行Java类,需要注意引入`%JAVA_HOME%/lib/tools.jar`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    本代码并非原创,是在我以前的学习笔记里面翻阅出来的,是csdn里面一位叫路人甲的朋友在论坛里面的回复,也许在这里发出来会帮助到很多朋友.其实十分简单就不加注释了,一共就3步,生成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的唯一一个用途呵呵.

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值