动态编译java源代码,不生成中间文件

直接贴代码实现

public class App2 {
    public static void main( String[] args ) throws Exception {
        String code = "public class Man {\n" +
                "\tpublic void hello(){\n" +
                "\t\tSystem.out.println(\"hello world\");\n" +
                "\t}\n" +
                "}";
        String className = "Man";

        JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
        JavaSourceManager javaFileManager = new JavaSourceManager(compiler.getStandardFileManager(null, null, null));

        JavaSourceFromString javaFileObject = new JavaSourceFromString(className, code);
        compiler.getTask(null, javaFileManager, null, null, null, Arrays.asList(javaFileObject)).call();
        
        JavaSourceFromString myJavaFileObject = javaFileManager.getMyJavaFileObject();
        
        ClassLoader classloader = new DynamicClassLoader(myJavaFileObject);
        Class<?> clazz  = classloader.loadClass(className);
        Method method = clazz.getMethod("hello");
        method.invoke(clazz.newInstance());
    }

	public static class DynamicClassLoader extends ClassLoader {
		private byte[] bytes;

		public DynamicClassLoader(JavaSourceFromString myJavaFileObject) {
			this.bytes = myJavaFileObject.toBytes();
		}

		@Override
		protected Class<?> findClass(String name) throws ClassNotFoundException {
			return defineClass(name, bytes, 0, bytes.length);
		}
	}

    public static class JavaSourceFromString extends SimpleJavaFileObject {
        private String source;
        private ByteArrayOutputStream baos;

        public JavaSourceFromString(String name, String source) {
            super(URI.create("String:///" + name + Kind.SOURCE.extension), Kind.SOURCE);
            this.source = source;
        }

        public JavaSourceFromString(String name, Kind kind){
            super(URI.create("String:///" + name + kind.extension), kind);
            source = null;
        }

        @Override
        public CharSequence getCharContent(boolean ignoreEncodingErrors){
            if(source == null){
                throw new IllegalArgumentException("source == null");
            }
            return source;
        }

        @Override
        public OutputStream openOutputStream() throws IOException {
            baos = new ByteArrayOutputStream();
            return baos;
        }

        public byte[] toBytes(){
            return baos.toByteArray();
        }
    }

    public static class JavaSourceManager extends ForwardingJavaFileManager<JavaFileManager> {
    	private JavaSourceFromString javaSourceFromString;
    	
        protected JavaSourceManager(JavaFileManager fileManager) {
            super(fileManager);
        }

        @Override
        public JavaFileObject getJavaFileForOutput(Location location, String qualifiedClassName, JavaFileObject.Kind kind, FileObject sibling) throws IOException {
        	JavaSourceFromString javaSource = new JavaSourceFromString(qualifiedClassName, kind);
        	this.javaSourceFromString = javaSource;
            return javaSource;
        }
        
		public JavaSourceFromString getMyJavaFileObject() {
			return javaSourceFromString;
		}
    }
}

运行结果

hello world
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值