代码使用了common-io,需要其jar
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 {
- System.out.println(filename);
- FileUtils.writeStringToFile(file, javaCode);// commons-io这个框架可以放很方便的操作文件
- } 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();
- }
- }
=============仅供参考============