看马士兵的动态代理模式模拟的例子

(1)首先创建一个接口

package com.alan.proxy.dynamic1;

public interface Flyable {
	
	void fly() ;
}

(2)创建这个接口的一个实现类

package com.alan.proxy.dynamic1;

public class Plane implements Flyable{

 @Override
 public void fly() {
  System.out.println("Plane is Flying....");
 }

}

(3)创建一个动态的代理类

package com.alan.proxy.dynamic1;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class Proxy {

	public static Object newInstance(Class intefc, InvocationHandler h) throws Exception {
		String rt = "\r\t" ;
		String methodStr = "" ;
		// 首先实现这个接口的所有方法
		Method[] methods = intefc.getMethods();
		for (Method m : methods) {
			methodStr += "@Override"+rt+
						"public void "+m.getName()+"(){"+rt+
						"    try{"+rt+
						"        Method md = "+intefc.getName()+".class.getMethod(\""+m.getName()+"\");" + rt +
						"        h.invoke(this,md);" +rt+
						"    }catch(Exception ex){}" +rt+
						"}" ;
						
		}
		String clazzStr =  "package com.alan.proxy.dynamic1;"+rt+
						   "import java.lang.reflect.Method;"+rt+
						   "public class $Proxy1 implements "+intefc.getName()+"{"+rt+
						   "    public $Proxy1(InvocationHandler h){"+rt+
						   "        this.h=h;"+rt+
						   "    }"+rt+
						   "private com.alan.proxy.dynamic1.InvocationHandler h ;"+rt+
						    methodStr +rt+
						   "}";
		//写入到一个java文件里面
		
		File file = new File("D:/workspace/JAVA_Pattern/src/com/alan/proxy/dynamic1/$Proxy1.java") ;
		FileWriter writer = null ;
		try {
			writer = new FileWriter(file);
			writer.write(clazzStr) ;
			writer.flush() ;
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				if(writer !=null){
					writer.close() ;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		//将这个Java文件加载到内存,并返回一个Object对象
		URL[] urls = new URL[] {new URL("file:/" + "D:/workspace/JAVA_Pattern/src/")};
		URLClassLoader ul = new URLClassLoader(urls);
		Class c = ul.loadClass("com.alan.proxy.dynamic1.$Proxy1");
		System.out.println(c);
		//返回一个代理对象
		Constructor ctr = c.getConstructor(InvocationHandler.class);
		Object m = ctr.newInstance(h);

		return m;
	}
}

(4)创建一个代理的处理器接口

package com.alan.proxy.dynamic1;

import java.lang.reflect.Method;

public interface InvocationHandler {
	void invoke(Object o, Method m) ;
}

(5)创建这个处理器的一个实现类

package com.alan.proxy.dynamic1;

import java.lang.reflect.Method;

public class CheckInvocationHandler implements InvocationHandler{
	
	private Object target ;
	public CheckInvocationHandler(Object target){
		this.target = target ;
	}
	@Override
	public void invoke(Object o, Method m) {
		try {
			//调用被代理对象的方法
			System.out.println("飞行器  起飞前检查......");
			m.invoke(target) ;
			System.out.println("飞行器起飞后 检查........");
		}catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

(6)创建一个测试类

package com.alan.proxy.dynamic1;

public class Client {
	public static void main(String[] args) {
		
		try {
			Flyable o = (Flyable)Proxy.newInstance(Flyable.class, new CheckInvocationHandler(new Plane())) ;
			o.fly() ;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行的结果:

class com.alan.proxy.dynamic1.$Proxy1
飞行器  起飞前检查......
Plane is Flying....
飞行器起飞后 检查........


 总结:

Proxy的主要功能是:动态的创建某个接口的代理类,通过调用处理器的处理方法来实现对某个接口的代理。

XXXInvocationHandler:实现对某个被代理对象的处理。





 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值