Java动态代理实例Division
要求:
在不修改Division类的定义前提下,请用动态代理的方式编写一个代理程序对Division的功能进行扩展修改,完成扩展后的除法计算功能。
a、编写一个动态代理处理器类,扩展除法功能如下:
(1).在除法计算前,可以检验除数是否为0,如果为0,则计算结果为-9999,并输出错误提示:除零错误!
(2).在除法计算后,可以检查是否有余数,如果有余数,则输出余数提示:余数为xxx
b、编写一个测试类,从键盘输入两个数,生成动态代理对象,通过代理对象进行除法计算,并输出最终结果。
c、编写其他可能需要的接口或类文件。
- Division类(不可变)
public class Division {
public int divide(int a, int b) {
int result=-1;
try{
System.out.println("开始计算.....");
result=a/b;
System.out.println("计算完毕.....");
return result;
}catch(Exception e){ }
return result;
}
}
- Math接口
public interface MathInterface {
int divide(int a,int b);
}
- Divide实现Math接口
public class Divide implements MathInterface{
Division division=new Division();
@Override
public int divide(int a, int b) {
int result=-1;
if (b==0){
System.out.println("除零错误,结果为: -9999");
result=-9999;
}else {
result= division.divide(a,b);
System.out.println("结果为: "+result);
if (a%b!=0){
System.out.println("余数为: "+a%b);
}
}
return 0;
}
}
- 代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DivisionProxy implements InvocationHandler{
private Object object;
public DivisionProxy(Object object){//传入实例对象
this.object=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
int result=-1;
if(method.getName().equals("divide")){
result= (int) method.invoke(object,args);//反射,实例对象object来完成动作,并传入参数
}
return result;
}
}
- 测试类
import java.lang.reflect.Proxy;
import java.util.Scanner;
public class TestProxy {
public static void main(String[] args) {
int a,b;
Scanner scanner=new Scanner(System.in);
a=scanner.nextInt();
b=scanner.nextInt();
DivisionProxy divisionProxy=new DivisionProxy(new Divide());//Divide传入实例
MathInterface MathInterface= (MathInterface) Proxy.newProxyInstance(TestProxy.class.getClassLoader(),new Class[]{MathInterface.class},divisionProxy);//参数1:本类的类加载器,2:接口类,3.代理实例
int result=MathInterface.divide(a,b);//返回答案
}
}
运行测试
13 3
开始计算.....
计算完毕.....
结果为: 4
余数为: 1
12 0
除零错误,结果为: -9999
12 3
开始计算.....
计算完毕.....
结果为: 4
更简单的方法CGLIB