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();
        }
    }
  • 相关阅读:
    nginx利用image_filter动态生成缩略图
    uva 624 CD 01背包打印路径
    【剑指Offer学习】【全部面试题汇总】
    POJ2096-Collecting Bugs(概率DP)
    配置struts tags 输出HTML
    合并基因表达水平(merge gene expression levels, FPKM)
    设置MySQL自动增长从某个指定的数开始
    列联表(Crosstabs)
    mysql 实现行号的方法——如何获取当前记录所在行号
    shell 标出输入、标准输出、错误输出
  • 原文地址:https://www.cnblogs.com/sprinng/p/4432797.html
Copyright © 2011-2022 走看看