文件结构和jar包(记得build Path)
MathI接口
package com.atguigu.proxy;
public interface MathI {
int add(int i,int j);
int sub(int i,int j);
int mul(int i,int j);
int div(int i,int j);
}
MathImpl类
package com.atguigu.proxy;
public class MathImpl implements MathI {
@Override
public int add(int i, int j) {
// System.out.println("method:add,arguments:"+i+","+j);
int result=i+j;
// TODO Auto-generated method stub
return result;
}
@Override
public int sub(int i, int j) {
int result=i-j;
// TODO Auto-generated method stub
return result;
}
@Override
public int mul(int i, int j) {
int result=i*j;
// TODO Auto-generated method stub
return result;
}
@Override
public int div(int i, int j) {
int result=i/j;
// TODO Auto-generated method stub
return result;
}
}
MyLogger日志类
package com.atguigu.proxy;
public class MyLogger {
public static void before(String methodName, String args) {
System.out.println("method:" + methodName + ",arguments:" + args);
}
public static void after(String methodName, String result) {
System.out.println("method:" + methodName + ",arguments:" + result);
}
public static void throwing(){
System.out.println("有异常了。。。。。。");
}
}
代理执行类
package com.atguigu.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class ProxyUtil {
private MathImpl mathImpl; // 目标对象(必须要有接口) 应该用Object暂时用MathImpl便于理解
public ProxyUtil(MathImpl mathImpl) {
super();
this.mathImpl = mathImpl;
}
public Object getProxy() { // 代理对象 this 代表当前类
// 获取当前类的类加载器 用来加载代理对象所属类
ClassLoader loader = this.getClass().getClassLoader();
// 获取目标对象所实现的所有接口的Class对象, 代理类会和目标类实现相同的接口,最终通过代理对象实现功能
Class[] interfaces = mathImpl.getClass().getInterfaces();
return Proxy.newProxyInstance(loader, interfaces,
new InvocationHandler() {
// invoke代表执行 代理对象中跟目标对象实现相同接口所产生的方法
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
// TODO Auto-generated method stub
// args代表方法执行时的参数 Object[] args代表的就是参数
try {
MyLogger.before(method.getName(),
Arrays.toString(args));
Object result = method.invoke(mathImpl, args); // 动态代理对象实现功能
MyLogger.after(method.getName(), result.toString());
return result;
} catch (Exception e) {
MyLogger.throwing();
e.printStackTrace(); // 将异常信息打印到控制台
}finally{
System.out.println("哪都有我");
}
return null;
}
});
}
}
测试类
package com.atguigu.proxy;
public class Test {
public static void main(String[] args) {
/*
* 自己调用
* MathI math=new MathImpl();
* int result =math.add(1, 1);
* System.out.println(result);
*/
ProxyUtil proxy=new ProxyUtil(new MathImpl());
MathI math=(MathI)proxy.getProxy();
int i=math.add(1,1);
System.out.println(i);
int j=math.div(1,1);
System.out.println(j);
}
}