设为首页 加入收藏

TOP

动态代理类的实现和解析(三)
2019-09-25 11:18:24 】 浏览:175
Tags:动态 代理 实现 解析
ssParamStr + "});"; 76 } else { 77 staticCodeStr += "m" + i + " = Class.forName(\"" + className + "\").getMethod(\"" + methodName + "\");"; 78 } 79 classParamStr = ""; 80 } 81 //静态代码块的拼接 82 staticCodeStr += "} catch (NoSuchMethodException e) {\r\n" + " e.printStackTrace();\r\n" 83 + " } catch (SecurityException e) {\r\n" + " e.printStackTrace();\r\n" 84 + " } catch (ClassNotFoundException e) {\r\n" + " e.printStackTrace();\r\n" + " }}"; 85 //总和成Java文件的内容 86 packageStr = packageStr + classStr + member_var + counstructStr + methodStr + staticCodeStr + "\n}"; 87 //通过流写入成文件 88 FileWriter fout = null; 89 try { 90 fout = new FileWriter(new File("src/" + package1 + "/" + simpleName + "$proxy0.java")); 91 } catch (IOException e) { 92 93 e.printStackTrace(); 94 } 95 BufferedWriter out = new BufferedWriter(fout); 96 try { 97 out.write(packageStr); 98 } catch (IOException e) { 99 e.printStackTrace(); 100 } 101 try { 102 out.close(); 103 fout.close(); 104 } catch (IOException e) { 105 e.printStackTrace(); 106 } 107 } 108 } View Code

 

/***
 *这个类是用来制定你的代理对象,在调用方法时需要进行哪些前置处理和后置处理
 *
*/
1
package proxyBase; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class Hadler<T> implements InvocationHandler { 7 private T target; 8 //通过new Hadler将被代理的那个对象传入, 9 public Hadler(T target) { 10 super(); 11 this.target = target; 12 } 13 private void before() { 14 System.out.println("先吃饭"); 15 } 16 private void after() { 17 System.out.println("再睡觉"); 18 } 19 //这里根据自己的逻辑来制定相应的invoke方法,视情况而定,此处的写法只是来简单测试代理对象。 20 @Override 21 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 22 before(); 23 Object invoke = method.invoke(target,args); 24 after(); 25 return invoke; 26 } 27 }

这里时生成后的代理类文件Person$proxy0.java

package proxyBase;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class Hadler<T> implements InvocationHandler {
    private T target;
    //通过new Hadler将被代理的那个对象传入,
    public Hadler(T target) {
        super();
        this.target = target;
    }
    private void before() {
        System.out.println("先吃饭");
    }
    private void after() {
        System.out.println("再睡觉");
    }
    //这里根据自己的逻辑来制定相应的invoke方法,视情况而定,此处的写法只是来简单测试代理对象。
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object invoke = method.invoke(target,args);
        after();
        return invoke;
    }
}

接下来是写一个接口,jdk中的动态代理是针对接口代理的,而cglib是针对类进行代理的,这个接口将会被代理,分别写了四个方法来测试,无参,一参,两参,和一个有返回值

的方法,都是用来测试GennerateClass类生成的是否正确,(目前只测试了这几种,如果大神发现有误,还望联系斧正)

1 package proxy;
2 
3 
4 public interface Person {
5     void study2();
6     void study2(int a);
7     void study3(int b ,String a);
8     int returnInt(int a);
9 }

接下来写一个Person的实现类,然后通过代理类来代理这个实现类对象,进行一些前置处理和后置处理。

 1 package proxy;
 2 
 3 public class Student implements Person {
 4     public void study2() {
 5         System.out.println("正在考试中");
 6     }
 7 
 8     @Override
 9     public void study2(int a) {
10         System.out.println(a);
11     }
12 
1
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇06.Django基础五之django模型层(.. 下一篇通俗易懂设计模式解析——模板方..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目