场景
实现一个类,该类实现了数学四则运算,实现日志功能,每次调用对应的运算时,输出相应的日志
基本功能接口
package com.javase.thread;
public interface Arithmetic {
public int add( int i, int j );
public int sub( int i, int j );
public int mul( int i, int j );
public int div( int i, int j );
}
接口的实现类
package com.javase.thread;
public class ArithmeticImp implements Arithmetic {
@Override
public int add(int i, int j) {
// TODO Auto-generated method stub
return i+j;
}
@Override
public int sub(int i, int j) {
// TODO Auto-generated method stub
return i-j;
}
@Override
public int mul(int i, int j) {
// TODO Auto-generated method stub
return i*j;
}
@Override
public int div(int i, int j) {
// TODO Auto-generated method stub
return i/j;
}
}
代理类输出日志
package com.javase.thread;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ArithmeticLoggingProxy {
//要代理的对象
private Arithmetic target;
public ArithmeticLoggingProxy( Arithmetic arithmetic ) {
this.target = arithmetic;
}
public Arithmetic getLoggingProxy() {
Arithmetic proxy = null;
//1.获取要代理对象的类加载器
ClassLoader classLoader = target.getClass().getClassLoader();
//2.代理对象的类型
Class [] interfaces = new Class[] {Arithmetic.class};
//3.当调用代理对象的方法是执行的代码
InvocationHandler h = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
System.out.println("正在执行的方法:"+method.getName());
Object result = method.invoke(target, args);
System.out.println("结果为: "+result);
return result;
}
};
proxy = (Arithmetic) Proxy.newProxyInstance(classLoader, interfaces, h);
return proxy;
}
}
Main函数
package com.javase.thread;
public class Main {
public static void main(String[] args) {
Arithmetic proxy = new ArithmeticLoggingProxy(new ArithmeticImp()).getLoggingProxy();
System.out.println(proxy.add(1, 2));
}
}