java 动态代理

package com.cjb.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;
import javax.tools.JavaCompiler.CompilationTask;


public class Test
{
 public static void main(String[] args) throws Exception
 {
  String rt = "\r\n";
  String source = "package com.cjb.proxy;" + ""+ rt
    + "public class Dealer implements Store"+ rt  + "{"+ rt  + "private Store s;" + rt +
    "public Dealer(Store s)"+ rt  + " {" + "  this.s = s;"+ rt
    + " }" + rt +

    public void sell()" + " {"+ rt
    + "  System.out.println(\"price markup....\");"+ rt
    + "  s.sell();" + " }" + rt+
    "}";

  String fileName = System.getProperty("user.dir")//获取到项目的根路径
    + "/src/com/cjb/proxy/Dealer.java";
  File f = new File(fileName);
  FileWriter fw = new FileWriter(f);
  fw.write(source);
  fw.flush();
  fw.close();//这里只是产生一个JAVA文件,简单的IO操作

  // compile下面开始编译这个Store.java
  JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
  StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null,
    null, null);
  Iterable units = fileMgr.getJavaFileObjects(fileName);
  CompilationTask t = compiler.getTask(null, fileMgr, null, null, null,
    units);
  t.call();
  fileMgr.close();

  // load into memory and create an instance
  URL[] urls = new URL[] { new URL("file:/"
    + System.getProperty("user.dir") + "/src") };
  URLClassLoader ul = new URLClassLoader(urls);
  Class c = ul.loadClass("com.cjb.proxy.Dealer");
  System.out.println(c);

//客户端调用

  Constructor ctr = c.getConstructor(Store.class);
  Store s = (Store)ctr.newInstance(new Supermarket());//这里看到,这个我们这个代理类必须实现Store的原因
  s.sell();
 }
}

总结下

这节的内容说的是动态的产生java文件并编译它..其实,说起来,我们直接写一个java文件会方便很多,因为其实我们的代码都在字符串source中的,但是,为什么还要这样费事的动态去产生,主要目的就是让项目少一个类.少一个JAVA文件.还有一个目的,可以看到,我们动态产生的这个类,在最后调用的时候,我们是不需要知道他的类名的.重要点在于动态.看懂了这个下面的动态代理才能知道根本

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值