`
knight_black_bob
  • 浏览: 823166 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

设计模式 之 代理模式

阅读更多

 

 

下载 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捐助),没钱捧个人场,谢谢各位。



 
 
 谢谢您的赞助,我会做的更好!

 

 

 

  • 大小: 11.6 KB
  • 大小: 50.7 KB
  • 大小: 319.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics