下载 23种设计模式源码 :http://download.csdn.net/download/knight_black_bob/8936043
创建型模式,共五种:
工厂方法模式 抽象工厂模式 单例模式 建造者模式 原型模式
结构型模式,共七种:
适配器模式 装饰器模式 代理模式 外观模式 桥接模式 组合模式 享元模式
行为型模式,共十一种:
策略模式 模板方法模式 观察者模式 迭代子模式 责任链模式 命令模式
马士兵 动态代理学习~~~~
package 设计模式.代理模式;
public interface Moveable {
void move();
}
package 设计模式.代理模式;
public class Tank implements Moveable{
@Override
public void move() {
System.out.println("tank moving");
}
}
package 设计模式.代理模式;
public class TankTimeProxy implements Moveable{
private Moveable t;
public TankTimeProxy(Moveable t) {
this.t = t;
}
@Override
public void move() {
long startTime = System.currentTimeMillis();
System.out.println("startTime: "+startTime);
t.move();
try { Thread.sleep(100); } catch (InterruptedException e) { }
long endTime= System.currentTimeMillis();
System.out.println("endTime: "+endTime);
System.out.println("运行时间为: "+(endTime-startTime) +"ms");
}
}
package 设计模式.代理模式;
import java.lang.reflect.Method;
public interface InvocationHandler {
void invoke(Object o,Method m);
}
package 设计模式.代理模式;
import java.lang.reflect.Method;
public class LogInvocationHandler implements InvocationHandler{
private Object target;
public LogInvocationHandler(Object target) {
this.target = target;
}
@Override
public void invoke(Object o, Method m) {
System.out.println("Tank start...........");
try { m.invoke(target); } catch (Exception e) { }
System.out.println("Tank stop..............");
}
}
package 设计模式.代理模式;
import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;
public class FileUtil {
public static void createFile(String pathstr) throws IOException{
String path = pathstr;
StringTokenizer st = new StringTokenizer(path,"/");
String path1 = st.nextToken()+"/";
String path2 = path1;
while(st.hasMoreTokens()) {
path1 = st.nextToken()+"/";
path2 += path1;
File inbox = new File(path2);
if(!inbox.exists())
inbox.mkdir();
}
}
}
package 设计模式.代理模式;
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.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
public class DynamicProxy {
public static Object newProxyIntenct(Class infac,InvocationHandler h) throws Exception{
String br ="\r\n";
String methString ="";
Method[] method = infac.getMethods();
for(Method m: method){
methString =
" @Override"+ br +
" public void "+m.getName()+"() {"+ br +
" try {" + br +
" Method md ="+ infac.getName()+".class.getMethod(\""+m.getName()+"\");"+ br +
" h.invoke(this,md);" + br +
" }catch (Exception e){ "+ br+
" e.printStackTrace();" + br +
" }" + br +
" }";
}
String src =
"package 设计模式.代理模式;" + br +
"import java.lang.reflect.Method;" + br +
"public class $DynamicProxy implements "+infac.getName()+"{" + br +
" private 设计模式.代理模式.InvocationHandler h;" + br +
" public $DynamicProxy(InvocationHandler h) {" + br +
" super();" + br +
" this.h = h;" + br +
" }" + br +
methString +br +
"}";
FileUtil.createFile("D:/cache/eclipse-workspace/Test/src/设计模式/代理模式");
//生成java文件
String fileName ="D:\\cache\\eclipse-workspace\\Test\\src\\设计模式\\代理模式\\$DynamicProxy.java";
File file = new File(fileName);
FileWriter fWriter = new FileWriter(file);
fWriter.write(src);
fWriter.flush();
fWriter.close();
//生成class文件,jdk6提供的工具类
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
//System.out.println(compiler.getClass().getName());
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable units = fileManager.getJavaFileObjects(fileName);
CompilationTask task = compiler.getTask(null, fileManager, null, null, null, units);
task.call();
fileManager.close();
//装载到内存,生成新对象
URL[] urls = new URL[]{new URL("file:/"+"D:\\cache\\eclipse-workspace\\Test\\src\\")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("设计模式.代理模式.$DynamicProxy");
//通过有参的构造器反射生成代理类的实例
Constructor ctr = c.getConstructor(InvocationHandler.class);
Object obj = (Object) ctr.newInstance(h);
return obj;
}
}
package 设计模式.代理模式;
public class ProxyTest {
public static void main(String[] args) throws Exception {
Tank t = new Tank();
Moveable move = new TankTimeProxy(t);
move.move();
System.out.println("--------------------------------");
Moveable move2 = (Moveable) DynamicProxy.newProxyIntenct(Moveable.class, new LogInvocationHandler(move));
move2.move();
}
}
如果发现 有 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 空指针 错误
请 把 jdk 中的 tool.jar 拷贝一份 放到 jre 中
捐助开发者
在兴趣的驱动下,写一个免费
的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(右上角的爱心标志,支持支付宝和PayPal捐助),没钱捧个人场,谢谢各位。
谢谢您的赞助,我会做的更好!