首页 > 其他 > 详细

实现动态代理

时间:2016-01-05 02:06:46      阅读:442      评论:0      收藏:0      [点我收藏+]

1 接口

public interface Pruduct {
	void selling();
}

?2 书籍类

public class Book implements Pruduct {
	@Override
	public void selling() {
		try {
			Thread.sleep(1000);
			System.out.println("books selling.....");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

?3 定义日志类

public class LogTranService{

	public static void before(){
		 
		System.out.println("begin log...");
	}

	public static void after(){
		System.out.println("finish log...");
	}

}

?4 定义时间类

public class TimeTranService {
	static long bgn;

	public static void before(){
		bgn = System.currentTimeMillis();
		System.out.println("begin time...  " + bgn);
	}
	public static void after(){
		long end = System.currentTimeMillis();
		System.out.println("end time...  " + (end-bgn));
	}

}

?5 定义InvocationHander?

import java.lang.reflect.Method;

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

?

import java.lang.reflect.Method;
public class ProxyHander implements InvocationHander {

	private Object target;
	public ProxyHander(Object target) {
		this.target = target;
	}
	@Override
	public void invoke(Object o, Method m) {
		try {
			TimeTranService.before();
			LogTranService.before();
			m.invoke(target);
			LogTranService.after();
			TimeTranService.after();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}

?6 代理类

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

import javax.tools.JavaCompiler;
import javax.tools.JavaCompiler.CompilationTask;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import org.apache.commons.io.FileUtils;
public class Proxy {
	/*
	 * 空的构造函数
	 */
	private Proxy(){
	}
	/*
	 * 返回代理类
	 */
	public static Object newProxyInstance(Class inter,InvocationHander h){
		String proxyClassName = "$Proxy3";
		String packageName  = inter.getPackage().getName();
		String InHanderPackage = h.getClass().getPackage().getName();
		String rt = "\r\n";// 换行
		String methodCode = "";
		for (Method method:inter.getMethods()) {
			methodCode+="	@Override"+rt+
			
			"	public void "+ method.getName()+"() {"+rt+
			"		try{"+rt+
			"			Method method  = "+inter.getName()+".class.getMethod(\"" 
			+ 			method.getName()+	"\");"+rt+
			"			h.invoke(this,method);      "+rt+
			" 	 	}catch(Exception e ){" +rt+
			"			e.printStackTrace();" +rt+
			"		}"+rt+
			"	}";
		}
		/*
		 * 总的java代码
		 */
		String javaCode=  
		"package  "+packageName+";"+rt+
		"import "+InHanderPackage+".InvocationHander;"+rt+
		
		"import java.lang.reflect.Method;"+rt+
		"public class "+proxyClassName+" implements "+inter.getName()+" {"+rt+
		"	public "+proxyClassName+"("+InHanderPackage+".InvocationHander h) {"+rt+
		"		super();"+rt+
		"		this.h = h;"+rt+
		"	}"+rt+
		"	private "+InHanderPackage+".InvocationHander h;"+rt+
		methodCode+rt+
		"}";
		/*
		 *  生成java文件
		 */
		// 生成文件路径
		String filename =  System.getProperty("user.dir")+"/bin/"+packageName+"/"+proxyClassName+".java";
		File file = new File(filename);
		try {
			// 需要commons-io的jar方便的操作文件
			FileUtils.writeStringToFile(file, javaCode); 
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		// 编译  拿到编译器
		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);
		// call进行编译
		t.call();
		try {
			fileMgr.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// load到内存
		ClassLoader cl = ClassLoader.getSystemClassLoader();
		try {
			Class c = cl.loadClass(packageName+"."+proxyClassName);
			Constructor ctr = c.getConstructor(InvocationHander.class);
			System.out.println("代理类的名字为:"+c.getName()+"===========");
			return ctr.newInstance(h);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

?7 测试

public class Client {
	public static void main(String[] args) {
		Book book = new Book();
		InvocationHander h = new ProxyHander(book);
		Pruduct m = (Pruduct)Proxy.newProxyInstance(Pruduct.class,h);
		m.selling();
	}
}

?

?

实现动态代理

原文:http://hangzhoujava.iteye.com/blog/2268400

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!