为什么要有这个模式
比方说你要看一个内容,看这个内容前要审批一下你是不是机器人,这个时候审批的功能就需要代理模式,代理模式也有修饰原来类的感觉。
1.静态代理
静态代理没啥说的,就是新建一个类继承要被修饰的类,然后增加一些附加功能
2.动态代理
一会还要介绍一个cglib代理,动态代理的类必须要实现一个接口类,这是两者的区别
public interface ITeacher {
public void teach();
public void sayHello(String name);
}
public class Teacher implements ITeacher {
@Override
public void teach() {
System.out.println("-----开始上课----");
}
@Override
public void sayHello(String name) {
System.out.println("hello" + name);
}
}
重要代码
需要被代理类的 class interfaces 还要 弄一个匿名的invocationhanler 去 调用 函数
public class ProxyFactory {
private Object target;
public ProxyFactory(Object target)
{
this.target = target;
}
public Object getProxyInstance()
{
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始代理");
Object returnVal = method.invoke(target,args);
return returnVal;
}
});
}
}
cglib代理 不需要 实现接口
首先 添加maven依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
然后写一个被代理对象
public class TeacherDao {
public void teach()
{
System.out.println("老师授课中 ,我是cglib代理不需要实现接口");
}
}
然后调用包代理一下
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class ProxyFactory implements MethodInterceptor {
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance()
{
//1,.创建工具类
Enhancer enhancer = new Enhancer();
//2.设置父类
enhancer.setSuperclass(target.getClass());
//3.创建回调函数
enhancer.setCallback(this);
//4.创建子类对象,即代理对象
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib代理模式开始");
Object returnValue = method.invoke(target, objects);
System.out.println("cglib代理对象提交");
return returnValue;
}
}
综上,希望对大家有帮助