目的:(1)通过引入你里对象的方式来间接仿问目标对象,防止直接访问目标衬象给系统带来的不必要复杂性;
(2)通过代理对象对原有的业务增强;
1 先看一个静态代理
静态代理:由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。
个人理解 其实就是 被代理类 不是java 反射机制生成的 就是静态代理
定义接口 Hello
被代理类
代理类
测试结果如下
(二) 动态代理
接口 Hello 以及 HelloWorld 都不需要改变,代理类 HelloProxy 需要继承 InvocationHandler , 代码如下:
package com.study.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HelloProxy implements InvocationHandler {
private Hello hello;
public HelloProxy(Hello hello) {
this.hello = hello;
}
private void before() {
System.out.println("-----------before----------------");
}
private void end() {
System.out.println("-----------end----------------");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object object = method.invoke(hello, args);
end();
return object;
}
public Object getProxyInstance() {
return Proxy.newProxyInstance(hello.getClass().getClassLoader(), hello.getClass().getInterfaces(), this);
}
}
测试结果跟刚才完全一样的:
一些思考:
单一职责原则:一个类或者一个接口只负责唯一项职责,尽量设计出功能单一的接口;依赖倒转原则二高层模块不应该依赖低层模块具体实现,解藕高层与低层。既面向接口编程,当实现表时,只需提供新的实现类,不需要修改高层模块代码
开放一封闭原则:程序对外扩展开放,对修改关闭;换句话说,当需求发生变化时,我们可以通过添加新代码来满足新需求,而不是通过修改原来的实现代码来满足新需求