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{ //打开文件 ...
随机推荐
- JetBrains 系列软件汉化包
原文地址:https://blog.csdn.net/pingfangx/article/details/78826145 JetBrains 系列软件汉化包 关键字: Android Studio ...
- SEEprog Serial EEPROM programmer
Features SEEprog is universal programmer of all types of serial EEPROMs in 8-pin package. SEEprog en ...
- C#中结构(struct)的部分初始化和完全初始化
假设有这样一个值类型struct. public struct Size { public int Length; public int Width; public int Area() { retu ...
- ios的一些知识点
ios的一些知识点 一 非ARC的内存管理情况 1-autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段落,开 ...
- Unity3d-Particle System系统的学习(三)
这节课我们来实战下上几节讲的几乎所有Particle System用到的参数. 我们今天制作下图所示的粒子: 类似于带有光晕的魔法球.用到的材质也就是上节课用到的材质贴图. http://pan.ba ...
- OpenShift上部署Redis主从集群
客户有部署有状态服务的需求,单机部署模式相对简单,尝试一下集群部署. 关于Redis的master,slave 以及sentinal的架构和作用不提,有兴趣可以参考之前的博客 https://www. ...
- [开发工具]_[VS2010]_[vs2010的一个bug-使用stringstream时出现]
1. 注冊Microsfot之后想提交bug, 发现有这个提示, 所以提交不了bug, 有能提交的提交下吧. You are not authorized to submit the feedback ...
- flume 日志导入elasticsearch
Flume配置 . flume生成的数据结构 <span style="font-size:18px;">"_index" : "logs ...
- ubuntu下mongodb常用命令
1. 启动脚本 #!/bin/bash mongod --dbpath /usr/local/mongodb/data1 chmod +x run-mongodb 2. 关闭数据库服务 官方文档说可以 ...
- JMS基本概念之一
The Java Message Service(JMS) API is a messaging standard that allows application components based o ...