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 = "\r\n";
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();
}
}
java 动态生成类再编译最后代理的更多相关文章
- 【原】如何获取Java动态生成类?
写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类, 有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子, 通过 ...
- Java动态生成类以及动态添加属性
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...
- Java 动态生成 PDF 文件
每片文章前来首小诗: 今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天. --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...
- Roslyn 编译器Api妙用:动态生成类并实现接口
在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...
- JAVA“动态”为类添加属性
部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>comm ...
- 利用Java动态生成 PDF 文档
利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...
- Java 动态生成复杂 Word
Java 动态生成复杂 Word 阅读目录 1. 制作 Word 模版,将你需要动态生成的字段用${}替换.2. 将 Word文档保存为 xml .3. 引入项目. 项目中需要用 java 程序生成d ...
- Java 动态分页类
动态分页类: Cls_page.java package pagination; public class Cls_page { private int nums;// 总条目数 private i ...
- java动态生成HTML文件
在eclipse中,用java动态生成html文件. //用于存储html字符串 StringBuilder stringHtml = new StringBuilder(); try{ //打开文件 ...
随机推荐
- lamp经典安装
一.网络方面的知识 2 ①-网络常见的命令 2 ②-网卡相关 2 ③-防火墙相关 2 ④-selinux相关 3 二.上传amp源代码包 5 三.linux下软件安装-vsftpd安装 6 ①-rpm ...
- WordPress Permissions Update Error [RESOLVED]
Recently I ran into an issue where an installation of WordPress that had never had any issues updati ...
- MAX II Device Compatibility with 5.0-V CMOS Devices
http://www.altera.com/literature/hb/max2/max2_mii51009.pdf The open-drain pin never drives high, onl ...
- Redhat Enterprise Linux 7.4/CentOS 7.4 安装后初始化配置
由于我是最小化安装,需要在安装后进行一些配置 1. 设定启动级别 [root@home ~]# systemctl set-default multi-user.target 2. 设定网络 [roo ...
- mysql 源代码编绎
http://blog.chinaunix.net/uid-20723616-id-769326.html https://software.intel.com/zh-cn/blogs/2010/08 ...
- ECCV 2014 Results (16 Jun, 2014) 结果已出
Accepted Papers Title Primary Subject Area ID 3D computer vision 93 UPnP: An optimal O(n) soluti ...
- java hashcode()和equal()方法比较
通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容. 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很 ...
- Selenium2+python自动化61-Chrome您使用的是不受支持的命令行标记:--ignore-certificate-errors
前言 您使用的是不受支持的命令行标记:--ignore-certificate-errors.稳定性和安全性会有所下降 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrom ...
- Struts2 无后缀action请求
如果将Struts2的filter-mapping配置成 <filter-mapping> <filter-name>struts2</filter-name> & ...
- 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSAUX
ylbtech-Oracle:数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSAUX 表空间 > 编辑 表空间: SYSAUX 1. 一般信息返 ...