• 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();
        }
    }
  • 相关阅读:
    C#编写功能让你的系统导入注册表文件时不提示
    登陆框提示历史记录
    C# 操作系统防火墙
    C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装 (续集Tomcat 配置)
    C# 修饰符你记住了吗?
    C# 实现设置系统环境变量设置
    showModalDialog使用例子,父窗口向子窗口传递值
    C#后台无刷新页面弹出alert方法
    VS2008 无法启动调试.未安装Silverlight托管调试包 .
    在GridView中使用FindControl .
  • 原文地址:https://www.cnblogs.com/sprinng/p/4432797.html
Copyright © 2020-2023  润新知