zoukankan      html  css  js  c++  java
  • java 动态生成类再编译最后代理

    package spring.vhostall.com.proxy;
    
    public interface Store {
        public void sell();
    }
    
    --------------------------------------------
    package spring.vhostall.com.proxy;
    
    public class Supermarket implements Store {
    
        @Override
        public void sell() {
            System.out.println("sel in supermarket.....");
        }
    }
    
    --------------------------------------------
    package spring.vhostall.com.proxy;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.lang.reflect.Constructor;
    import java.net.URL;
    import java.net.URLClassLoader;
    
    import javax.tools.JavaCompiler;
    import javax.tools.StandardJavaFileManager;
    import javax.tools.ToolProvider;
    
    public class Test {
        public static void main(String[] args) throws Exception {
            String rt = "
    ";
            StringBuilder source = new StringBuilder();
            source.append("package spring.vhostall.com.proxy;" + rt + rt);
            source.append("public class Dealer implements Store" + " {" + rt);
            source.append("    private Store s;" + rt + rt);
            source.append("    public Dealer(Store s) {" + rt);
            source.append("        this.s = s;" + rt);
            source.append("    }" + rt + rt);
            source.append("    public void sell()" + " {" + rt);
            source.append("        System.out.println("price markup....");" + rt);
            source.append("        s.sell();" + rt);
            source.append("    }" + rt);
            source.append("}");
    
            String fileName = System.getProperty("user.dir")// 获取到项目的根路径
                    + "/src/spring/vhostall/com/proxy/Dealer.java";
            File f = new File(fileName);
            FileWriter fw = new FileWriter(f);
            fw.write(source.toString());
            fw.flush();
            fw.close();// 这里只是产生一个JAVA文件,简单的IO操作
    
            // compile下面开始编译这个Store.java
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            URL[] urls = new URL[] { new URL("file:/"
                    + System.getProperty("user.dir") + "/src") };
            URLClassLoader ul = new URLClassLoader(urls);
            Class c = ul.loadClass("spring.vhostall.com.proxy.Dealer");
    
            // 客户端调用
    
            Constructor ctr = c.getConstructor(Store.class);
            Store s = (Store) ctr.newInstance(new Supermarket());// 这里看到,这个我们这个代理类必须实现Store的原因
            s.sell();
        }
    }
  • 相关阅读:
    [习题]输入自己的生日(年/月/日)#2 -- 日历(Calendar)控件的时光跳跃,一次跳回五年、十年前?--TodaysDate属性、VisibleDate属性
    Interesting effects
    kendoGrid methods方法
    kendoListBox 选择控件
    kendo format
    kendoGrid Event事件
    kendoGrid的一些基础配置
    kendoGrid edit功能
    kendoDatePicker日期选择控件
    Json与DataSet转化
  • 原文地址:https://www.cnblogs.com/sprinng/p/4432797.html
Copyright © 2011-2022 走看看