自己实现动态代理

package com.proxy;

public interface Inter {
	public void sayhello();
	public void sayHi();
}


package com.proxy;

public class Target implements Inter{

	@Override
	public void sayhello() {
		System.out.println(" hello ^_^");
	}

	@Override
	public void sayHi() {
		System.out.println(" hi ~_~");
		
	}
}

package com.proxy;

import java.io.File;
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 MyProxy {
	public static Object newProxyInstance(Class infce) throws Exception {
		String classStr = " ";
		String turn="\r\n";
		String mehordStr="";
		
		for(Method m : infce.getMethods()){
			mehordStr+=
			"	@Override"+turn+
			"	public void " + m.getName() + "() {"+turn+
			"		System.out.println(\"BEFORE:["+m.getName()+"]\");"+turn+
			"		inter." + m.getName() + "();"+turn+
			"		System.out.println(\"AFTER:["+m.getName()+"]\");"+turn+
			"	}"+turn;
		}
		
		classStr +=
		"package com.proxy;"+turn+
		"public class $Proxy0 implements "+infce.getName()+ "{"+turn+
		"	private "+infce.getName()+" inter;"+turn+
		"	public $Proxy0( "+infce.getName()+" inter) {"+turn+
		"		super();"+turn+
		"		this.inter = inter;"+turn+
		"	}"+turn+
		mehordStr+
		"}"+turn;
		// 产生代理类的java文件
		String filename = System.getProperty("user.dir") + "/bin/com/proxy/$Proxy0.java";
		System.out.println(filename);
		File file = new File(filename);
		FileUtils.writeStringToFile(file, classStr);

		// 编译
		// 拿到编译器
		JavaCompiler complier = ToolProvider.getSystemJavaCompiler();
		// 文件管理者
		StandardJavaFileManager fileMgr = complier.getStandardFileManager(null, null, null);
		// 获取文件
		Iterable units = fileMgr.getJavaFileObjects(filename);
		// 编译任务
		CompilationTask t = complier.getTask(null, fileMgr, null, null, null, units);
		// 进行编译
		t.call();
		fileMgr.close();

		//load 到内存
		ClassLoader cl = ClassLoader.getSystemClassLoader();
		Class c = cl.loadClass("com.proxy.$Proxy0");
		Constructor ctr = c.getConstructor(infce);
		return ctr.newInstance(new Target());


	}
}

package com.proxy;

public class Test {
	public static void main(String[] args) throws Exception {
		Inter o=(Inter) MyProxy.newProxyInstance(Inter.class);
		o.sayhello();
		o.sayHi();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值