静态代理
静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
public interface Person {
voidgiveMoney();
}
public class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
}
@Override
publicvoid giveMoney() {
System.out.println(name+ "上交班费50元");
}
}
public class StudentsProxy implementsPerson {
Studentstu;
publicStudentsProxy(Person stu) {
if(stu.getClass()== Student.class) {
this.stu= (Student)stu;
}
}
@Override
publicvoid giveMoney() {
stu.giveMoney();
}
}
public class StaticProxyTest {
publicstatic void main(String[] args) {
Personzhangsan = new Student("张三");
Personmontor = new StudentsProxy(zhangsan);
montor.giveMoney();
}
}
动态代理
动态代理模式主要由四个元素共同构成:
1. 接口,接口中的方法是要真正去实现的
2. 被代理类,实现上述接口,这是真正去执行接口中方法的类
3. 代理类,实现InvocationHandler,帮助被代理类去实现方法
4. 测试用例:
public interface ArithmeticCalculator {
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);
}
public class ArithmeticCalculatorImplimplements ArithmeticCalculator {
@Override
publicint add(int i, int j) {
intresult = i + j;
returnresult;
}
@Override
publicint sub(int i, int j) {
intresult = i - j;
returnresult;
}
@Override
publicint mul(int i, int j) {
intresult = i * j;
returnresult;
}
@Override
publicint div(int i, int j) {
intresult = i / j;
returnresult;
}
}
public classArithmeticCalculatorLoggingProxy {
private ArithmeticCalculator target;
public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target) {
this.target = target;
}
public ArithmeticCalculatorgetLoggingProxy() {
ArithmeticCalculator proxy = null;
//代理对象由哪一个类加载器加载
ClassLoader loader =target.getClass().getClassLoader();
//代理对象类型,即其中有哪些方法
Class [] interfaces = new Class[]{ArithmeticCalculator.class};
//当调用代理对象其中方法,该执行代码
InvocationHandler h = newInvocationHandler() {
/**
*proxy:正在返回的那个代理对象,一般情况下在invoke方法中都不使用该对象
*method:正在被调用的方法
*args:调用方法时传入的参数
*/
@Override
publicObject invoke(Object proxy, Method method, Object[] args) throws Throwable {
Stringmethodname = method.getName();
System.out.println("Themethod " + methodname + "brgins with" + Arrays.asList(args));
Objectresoult = method.invoke(target, args);
System.out.println("Themethod " + methodname + "end with" + resoult);
returnresoult;
}
};
proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);
return proxy;
}
}
public class Main {
publicstatic void main(String[] args) {
ArithmeticCalculatortarget = new ArithmeticCalculatorImpl();
ArithmeticCalculatorproxy = new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();
intresult = proxy.add(1, 2);
System.out.println(result);
}
}