使用javax.tools.JavaCompiler根据字符串内容动态生成新的Java类并编译成.class

测试代码:

package dynamicproxy;

public class DynamicProxy implements IHelloWorld
{
	IHelloWorld helloWorld;

	public DynamicProxy(IHelloWorld helloWorld)
	{
		this.helloWorld = helloWorld;
	}

	public void print()
	{
		System.out.println("Before Hello World!");
		helloWorld.print();
		System.out.println("After Hello World!");
	}
}

package dynamicproxy;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

class HelloWorldImp implements IHelloWorld {
	public void print() {
		System.out.println("Hello World");
	}
}

public class DynamicProxyDemo implements Serializable {
	private static final long serialVersionUID = 1L;

	public static void main(String[] arg) throws Exception {
		Class<?> c = getProxyClass();
		Constructor<?> constructor = c.getConstructor(IHelloWorld.class);
		IHelloWorld helloWorldImpl = new HelloWorldImp();
		IHelloWorld helloWorld = (IHelloWorld) constructor.newInstance(helloWorldImpl);

		helloWorld.print();
	}

	private static String getSourceCode() {
		String src = "package dynamicproxy;\n\n"
				+ "public class DynamicProxy implements IHelloWorld\n" + "{\n"
				+ "\tIHelloWorld helloWorld;\n\n"
				+ "\tpublic DynamicProxy(IHelloWorld helloWorld)\n" + "\t{\n"
				+ "\t\tthis.helloWorld = helloWorld;\n" + "\t}\n\n"
				+ "\tpublic void print()\n" + "\t{\n"
				+ "\t\tSystem.out.println(\"Before Hello World!\");\n"
				+ "\t\thelloWorld.print();\n"
				+ "\t\tSystem.out.println(\"After Hello World!\");\n" + "\t}\n"
				+ "}";
		return src;
	}

	private static String createJavaFile(String sourceCode) {
		String fileName = "C:\\Users\\i042416\\git\\JavaTwoPlusTwoEquals5\\src\\dynamicproxy\\DynamicProxy.java";
		File javaFile = new File(fileName);
		Writer writer;
		try {
			writer = new FileWriter(javaFile);
			writer.write(sourceCode);
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return fileName;
	}

	private static void compile(String fileName) {
		try {
			JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
			StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null);
			Iterable<? extends JavaFileObject> iter = sjfm.getJavaFileObjects(fileName);
			CompilationTask ct = compiler.getTask(null, sjfm, null, null, null, iter);
			ct.call();
			sjfm.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static Class<?> loadClass() {
		URL[] urls;
		Class<?> c = null;
		try {
			urls = new URL[] { (new URL("file:\\"
					+ "C:\\Users\\i042416\\git\\JavaTwoPlusTwoEquals5\\src\\")) };
			URLClassLoader ul = new URLClassLoader(urls);
			c = ul.loadClass("dynamicproxy.DynamicProxy");
			System.out.println("Class loaded successfully: " + c.getName());
			ul.close();
		} catch (ClassNotFoundException | IOException e) {
			e.printStackTrace();
		}
		return c;
	}

	private static Class<?> getProxyClass() {
		String sourceCode = getSourceCode();
		String javaFile = createJavaFile(sourceCode);
		compile(javaFile);
		return loadClass();
	}
}

package dynamicproxy;

import java.io.File;
import java.io.FileWriter;
import java.io.Serializable;
import java.io.Writer;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

interface HelloWorld
{
    void print();
}

class HelloWorldImpl implements HelloWorld
{
    public void print()
    {
        System.out.println("Hello World");
    }
}


public class DynamicProxyTest implements Serializable
{
    private static final long serialVersionUID = 1L;
 
    private static void test() throws Exception{
    	long start = System.currentTimeMillis();
        HelloWorld helloWorld = (HelloWorld) newProxyInstance();
        System.out.println("动态生成代理耗时:" + (System.currentTimeMillis() - start) + "ms");
        helloWorld.print();
        System.out.println();
    }
    
    public static void main(String[] arg) throws Exception{
    	test();
    }
    public static Object newProxyInstance() throws Exception
    {
        String src = "package dynamicproxy;\n\n" + 
                     "public class StaticProxy implements HelloWorld\n" + 
                     "{\n" + 
                     "\tHelloWorld helloWorld;\n\n" + 
                     "\tpublic StaticProxy(HelloWorld helloWorld)\n" + 
                     "\t{\n" + 
                     "\t\tthis.helloWorld = helloWorld;\n" + 
                     "\t}\n\n" + 
                     "\tpublic void print()\n" + 
                     "\t{\n" + 
                     "\t\tSystem.out.println(\"Before Hello World!\");\n" + 
                     "\t\thelloWorld.print();\n" + 
                     "\t\tSystem.out.println(\"After Hello World!\");\n" + 
                     "\t}\n" + 
                     "}";
 
        /** 生成一段Java代码 */
        String fileDir = System.getProperty("user.dir");
        String fileName = "C:\\Users\\i042416\\git\\JavaTwoPlusTwoEquals5\\src\\dynamicproxy\\StaticProxyDemo.java";
        File javaFile = new File(fileName);
        Writer writer = new FileWriter(javaFile);
        writer.write(src);
        writer.close();
 
        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager sjfm = compiler.getStandardFileManager(null, null, null);
        Iterable<? extends JavaFileObject> iter = sjfm.getJavaFileObjects(fileName);
        CompilationTask ct = compiler.getTask(null, sjfm, null, null, null, iter);
        ct.call();
        sjfm.close();
 
        URL[] urls = new URL[] {(new URL("file:\\" + "C:\\Users\\i042416\\git\\JavaTwoPlusTwoEquals5\\dynamicproxy\\src"))};
        URLClassLoader ul = new URLClassLoader(urls);
        System.out.println("class loader for url");
        Class<?> c = ul.loadClass("dynamicproxy.StaticProxy");
 
        Constructor<?> constructor = c.getConstructor(HelloWorld.class);
        HelloWorld helloWorldImpl = new HelloWorldImpl();
        HelloWorld helloWorld = (HelloWorld)constructor.newInstance(helloWorldImpl);
 
        File classFile = new File(fileDir + "\\src\\com\\xrq\\proxy\\StaticProxy.class");
        javaFile.delete();
        classFile.delete();
        ul.close();
 
        return helloWorld;
    }
}

package dynamicproxy;

public interface IHelloWorld
{
    void print();
}
展开阅读全文

Python数据分析与挖掘

01-08
92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元   为什么学习数据分析?       人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。       从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。    本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。   二、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。   三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。   四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。   五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分、聚、预测3大型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值