zoukankan      html  css  js  c++  java
  • java动态加载

    先贴个笔记,后续用得着再深究。

    package test;
    
    import java.io.File;
    import java.io.IOException;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.nio.charset.StandardCharsets;
    import java.nio.file.Files;
    
    import javax.tools.JavaCompiler;
    import javax.tools.ToolProvider;
    
    public class SimpleRun {
    
        public static void showCompile() {
            // Prepare source somehow.
            String source = "package test; public class Test { static { System.out.println("hello"); } public Test() { System.out.println("world");} public void Hello(){System.out.println("fuck");} }";
            // Save source in .java file.
            File root = new File("~/temp"); // On Windows running on C:\, this is
                                            // C:java.
            File sourceFile = new File(root, "test/Test.java");
            sourceFile.getParentFile().mkdirs();
            try {
                Files.write(sourceFile.toPath(), source.getBytes(StandardCharsets.UTF_8));
                // Compile source file.
                JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
                int success = compiler.run(null, null, null, sourceFile.getPath());
                if (success == 0) {
                    // Load and instantiate compiled class.
                    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
                    Class<?> cls;
                    try {
                        // Should print "hello".
                        cls = Class.forName("test.Test", true, classLoader);
                        // Should print "world".
                        Object instance = cls.newInstance();
                        // Should print "test.Test@hashcode".
                        System.out.println(instance);
                        Method m = cls.getMethod("Hello", new Class<?>[] {});
                        System.out.println(m);
                        m.invoke(instance, new Object[]{});
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.out.println("compile failed");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static double calculate(String expr) {
            String className = "Calculator";
            String methodName = "calculate";
            String source = "package test;  public class " + className + " { public static double " + methodName + "() { return " + expr
                    + "; } }";
            // set work directory
            File root = new File("~/temp");
            // set work package
            File sourceFile = new File(root, "test/Calculator.java");
            sourceFile.getParentFile().mkdirs();
            try {
                Files.write(sourceFile.toPath(), source.getBytes(StandardCharsets.UTF_8));
                // Compile source file.
                JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
                int success = compiler.run(null, null, null, sourceFile.getPath());
                if (success == 0) {
                    // Load and instantiate compiled class.
                    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
                    Class<?> cls;
                    try {
                        cls = Class.forName("test.Calculator", true, classLoader);
                        Object instance = cls.newInstance();
                        Method method = cls.getMethod(methodName, new Class<?>[] {});
                        Object value = method.invoke(instance, new Object[] {});
                        return (Double) value;
                    } catch (ClassNotFoundException | IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    } catch (SecurityException e) {
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    }
                } else {
                    System.out.println("compile failed");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return 0.0;
        }
    
        public static void main(String[] args) {
            SimpleRun.showCompile();
            if (args.length >= 1) {
                System.out.println(args[0] + "=" + SimpleRun.calculate(args[0]));
            }
        }
    }

    参考:

    http://www.infoq.com/cn/articles/cf-java-byte-code

  • 相关阅读:
    解决方案-文件管理系统:百科
    计算机:轮询
    公司-科技-安全狗:百科
    职位-金融:CFA(特许金融分析师)
    un-解决方案-BPM:百科
    un-协议-LDAP:百科
    引擎-搜索引擎-Java:ElasticSearch
    云-京东云:目录
    计算机:E-Learning
    Runoob-JSP:JSP 国际化
  • 原文地址:https://www.cnblogs.com/zhangqingping/p/6613217.html
Copyright © 2011-2022 走看看