动态代理
动态代理
JDK已经实现了动态代理,接口变更之后,切入可以更加接口方法变化切入。
public interface IRent {
void rent();
void job();
void c();
}
public class HouseKeeper implements IRent {
@Override
public void rent() {
System.out.println("出租豪华三室一厅");
}
@Override
public void job() {
System.out.println("找工作");
}
@Override
public void c() {
System.out.println("C");
}
}
public class AgentMaker implements InvocationHandler {
private Object real; //传入的真实对象
public AgentMaker(IRent real) {
this.real = real;
}
/**
* 产生代理对象
* @return
*/
public IRent createAgent() {
return (IRent) Proxy.newProxyInstance(real.getClass().getClassLoader(),
real.getClass().getInterfaces(), this);
}
/**
* 调用真实对象的方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object retVal = method.invoke(this.real, args);
after();
return retVal;
}
private void before() {
System.out.println("收取2500押金");
}
private void after() {
System.out.println("每月检查卫生一次,不合格罚款100元");
}
}
@Test
public void test() {
HouseKeeper real = new HouseKeeper();
IRent r = new AgentMaker(real).createAgent();
r.c();
}
静态代理
public interface IRent {
void rent();
}
public class HouseKeeper implements IRent {
@Override
public void rent() {
System.out.println("出租豪华三室一厅");
}
}
public class HouseAgent implements IRent {
private IRent real;
public HouseAgent(IRent real) {
this.real = real;
}
@Override
public void rent() {
this.real.rent();
}
}
@Test
public void test() {
IRent real = new HouseKeeper();
IRent agent = new HouseAgent(real);
agent.rent();
}
优点: 隐藏真实对象(Real)
代理对象的方法进行功能添加修改
缺点: 接口不可变的
cglib代理
动态代理问题:如果真实对象没有实现任何接口
继承机制:子类继承父类的方法:覆盖
package com.dyit.service.impl;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class AgentMaker implements MethodInterceptor {
private Object real;
public AgentMaker(Object real) {
this.real = real;
}
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(real.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
private void before() {
System.out.println("收取2500押金");
}
private void after() {
System.out.println("每月检查卫生一次,不合格罚款100元");
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object retVal =proxy.invokeSuper(obj, args);
after();
return retVal;
}
}