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