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();
    }
}
时间: 2024-08-29 21:26:39

java 动态生成类再编译最后代理的相关文章

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

Java逆向基础之动态生成类

为什么有这个东西,一方面时AOP框架的需要,另一方面是增加软件逆向的难度 动态生成类的技术目前大体上分为两类,一类是通过操作字节码框架如cglib/Javassist去实现,另一类就是JNI方式,调用dll/so库,内存中动态还原.这两种方式都能实现隐藏类 看一个Javassist动态生成类的例子 package com.vvvtimes; import java.lang.reflect.Modifier; import javassist.ClassPool; import javassis

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一

JAVA“动态”为类添加属性

部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependenc

利用Java动态生成 PDF 文档

利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那么目前最佳的解决方案,你可能会想到 iText ,对没错... iText+(Velocity / Freemarker)可以实现.不过据我熟悉,iText本身提供的HTML解析器还是不够强大,许多HTML标签和属性无法识别,更悲催的是简单的CSS它不认识,排版调整样式会让你头大的.不要失望,接下来

Java 动态生成 复杂 .doc文件

项目中需要用 java 程序生成doc 文件,百度一番,FreeMarker 的评价比较高,FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,至于想详细了解 FreeMarker 的请去问百度..... 这篇博文主要是总结自己在用网上例子时遇到的坑.吃水不忘挖井人,还是要感谢分享技术的前辈: 原文链接: http://www.360doc.com/content/13/0731/10/13247663_303740756.shtml [博主博客很漂亮,赞一个] 参

PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)(转)

面向对象模型 面向对象模型是利用UML(统一建模语言)的图形来描述系统结构的模型,它从不同角度实现系统的工作状态.这些图形有助于用户,管理人员,系统分析人员,开发人员,测试人员和其他人员之间进行信息交流.这里主要介绍用例图,序列图和类图.   1.面向对象模型OOM 面向对象模型是利用UML的图形描述系统结构的模型,可以利用PowerDesigner的面向对象模型进行创建.PowerDesigner支持UML的下列图形. 用例图(User Case Diagram):通常用来定义系统的高层次草图

Java 动态创建类

/* * 动态创建代理类 */ public static <T> T getProxy(Class<?> interfaceType,final Object target) throws Exception{ if(!interfaceType.isInterface()){  throw new Exception("接口类型不正确!"); } @SuppressWarnings("unchecked") T targerInstanc

C# 动态生成类 枚举等

private void GenerateCode() { /*注意,先导入下面的命名空间 using System.CodeDom using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflection; */ //准备一个代码编译器单元 CodeCompileUnit unit = new CodeCompileUnit(); //准备必要的命名空间(这个是指要生成的类的空间) CodeNamespace