使用流程
创建一个类继承接口InvocationHandler 并重写其中的public Object invoke(Object proxy, Method method, Object[] args) 因为方法里面要调用 你需要增强的代码 是用反射里面的invoke 所以需要传递一个对象 所以我们可以在构造这个类的时候顺便传进来
具体代码如下
/**
*
* @param method 为需要增强的方法
* @param args 为要增强方法的需要的参数
* @return 返回的类型必须是增强方法的返回值类型 否则会有报错 例如
* Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot
be cast to [Ljava.lang.String;
* at com.sun.proxy.$Proxy0.say(Unknown Source)
* at com.example.tests.T1test.main(T1test.java:14)
* @throws Throwable
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class T1Handler implements InvocationHandler {
private Object target; //目标方法的调用对象
public T1Handler(Object target) { //利用
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("T1Handler开始工作,这里为可以强化的功能");
System.out.println("这里可以增强功能代码");
Object re=method.invoke(target,args);//调用 你要增强的代码 实现原有的功能
System.out.println("这里可以增强功能代码");
return re;
}
}
学习所准备的要增强的类
要增强的方法
public interface ITC1 {
String[] say(String...str);
}
实现这个方法的类
import java.lang.reflect.Proxy;
public class TC1 implements ITC1{
public String[] say(String...str){
System.out.println("原有代码执行开始");
for (int i = 0; i <str.length ; i++) {
System.out.println("TC1的say开始工作第"+i+"个参数是"+str[i]);
}
System.out.println("原有代码执行结束");
return str;
}
}
下面是如何调用增强后的方法
public static void main(String[] args) {
ITC1 tc1 = new TC1();
T1Handler t1Handler=new T1Handler(tc1);
ITC1 proxyTC1= (ITC1) Proxy.newProxyInstance(
tc1.getClass().getClassLoader(),
tc1.getClass().getInterfaces(),
t1Handler
);
String[] re=proxyTC1.say(new String[]{"狗1","狗2","狗3"});
System.out.println(re);
}
结果如下
T1Handler开始工作,这里为可以强化的功能
TC1的say开始工作第0个参数是狗1
TC1的say开始工作第1个参数是狗2
TC1的say开始工作第2个参数是狗3
re的返回类型为:[Ljava.lang.String;
[Ljava.lang.String;@2c7b84de