设计模式之动态代理

[img]http://dl.iteye.com/upload/attachment/465168/8f9582b6-59e7-30c9-889a-0cdef5cb8288.png[/img]

动态代理的具体实现实现代码
代理方法类的接口InvocationHandler;

package com.proxy;
import java.lang.reflect.Method;

import com.proxy.InvocationHandler;
/**
* 时间代理类
* @author Administrator
*
*/
public class TimeHandler implements InvocationHandler{
/**
* 要被代理的对象
*/
private Object target;

public TimeHandler(Object target) {
super();
this.target = target;
}

/**
* 在方法的前后可以添加自己的逻辑
*/
@Override
public void invoke(Method method) {
System.out.println("start"+System.currentTimeMillis());
try {
method.invoke(target);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("end"+System.currentTimeMillis());

}

}


Moveable接口

package com.proxy;

public interface Moveable {
public void move();
}


具体实体类Tank.java
package com.proxy;
/**
* 坦克类
* @author Administrator
*
*/
public class Tank implements Moveable{

@Override
public void move() {
System.out.println("坦克开起来...");
}

public static void main(String[] args) throws Exception
{
Tank k=new Tank();
Moveable m=(Moveable) Proxy.newProxyInstance(Moveable.class , new TimeHandler(k));
m.move();
}

}


动态生成代理类 Proxy.java

package com.proxy;

import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
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;
/**
* 动态代理类
* @author Administrator
*
*/
public class Proxy {
/**
*
* @param infce 要代理interface
* @param h 需要代理的方法
* @return
* @throws Exception
*/
public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASM
String methodStr = "";
String rt = "\r\n";

Method[] methods = infce.getMethods();

/**
* 得到该类的所有方法,都进行代理
*/
for(Method m : methods) {
methodStr += "@Override" + rt +
"public void " + m.getName() + "() {" + rt +
" try {" + rt +
" Method md = " + infce.getName() + ".class.getMethod(\"" +
m.getName() + "\");" + rt +
" h.invoke( md);" + rt +
" }catch(Exception e) {e.printStackTrace();}" + rt +

"}";
}

String src =
"package com.proxy;" + rt +
"import java.lang.reflect.Method;" + rt +
"public class $Proxy1 implements " + infce.getName() + "{" + rt +
" public $Proxy1(InvocationHandler h) {" + rt +
" this.h = h;" + rt +
" }" + rt +


" com.proxy.InvocationHandler h;" + rt +

methodStr +
"}";

String fileName =
"D:/EclipseWorkplace/JavaProject/DesignPattern/src/com/proxy/$Proxy1.java";
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
fw.write(src);
fw.flush();
fw.close();

/**
* 编译目标类
*/
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();

/**
* 把目标类加入内存并且创建一个实例
*/
URL[] urls = new URL[] {new URL("file:/" + "D:/EclipseWorkplace/JavaProject/DesignPattern/src/")};
URLClassLoader ul = new URLClassLoader(urls);
Class c = ul.loadClass("com.proxy.$Proxy1");
Constructor ctr = c.getConstructor(InvocationHandler.class);
Object m = ctr.newInstance(h);
return m;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值