动态代理动态代理和静态代理
dunamic proxy
动态代理模式相比静态代理,不需要自己写代理类
jdk可以实现动态代理
操作如下:
公共接口:
/*** ClassName: House<br/>
* Description: 房子<br/>
* date: 2018/12/26 11:08 AM<br/>
*
* @author chengluchao
* @since JDK 1.8
*/
public interface House {
/**
* 地址
*/
void address();
/**
* 房租
*/
void rent();
/***
* 租期
*/
void leaseTerm();
/**
* 房东
*/
void landlord();
}
真实角色:
/*** ClassName: RealHouse<br/>
* Description: 房东<br/>
* date: 2018/12/26 11:14 AM<br/>
*
* @author chengluchao
* @since JDK 1.8
*/
public class RealHouse implements House {
@Override
public void address() {
System.out.println("北京市-东城区-长安街-1号院-1号楼-1单元-101");
}
@Override
public void rent() {
System.out.println("3000/月");
}
@Override
public void leaseTerm() {
System.out.println("2年");
}
@Override
public void landlord() {
System.out.println("王大户");
}
}
实现接口:
/*** ClassName: HouseHandler<br/>
* Description: <br/>
* date: 2018/12/27 10:25 AM<br/>
*
* @author chengluchao
* @since JDK 1.8
*/
public class HouseHandler<T> implements InvocationHandler {
private T t;
public HouseHandler(T t) {
this.t = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("真实操作前的操作");
if (method.getName().equals("rent"))
System.out.println("9000");
else
method.invoke(t, args);
return null;
}
}
测试类:
/*** ClassName: HouseTest<br/>
* Description:测试类 <br/>
* date: 2018/12/26 11:21 AM<br/>
*
* @author chengluchao
* @since JDK 1.8
*/
public class HouseTest {
public static void main(String[] args) {
House real = new RealHouse();
HouseHandler handler = new HouseHandler(real);
House proxy = (House) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{House.class}, handler);
proxy.address();
proxy.landlord();
proxy.leaseTerm();
proxy.rent();
}
}
真实操作前的操作
北京市-东城区-长安街-1号院-1号楼-1单元-101
真实操作前的操作
王大户
真实操作前的操作
2年
真实操作前的操作
9000
也可以使用lambad表达式,不需要写接口的实现类,直接在测试方法中调用:
static void lamdTest() {House proxy = (House) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{House.class}, (object, method, args) -> {
System.out.println("lamdTest-真实操作前的操作");
if (method.getName().equals("rent"))
System.out.println("9000");
else
method.invoke(new RealHouse(), args);
return null;
});
proxy.address();
proxy.landlord();
proxy.leaseTerm();
proxy.rent();
}
lamdTest-真实操作前的操作
北京市-东城区-长安街-1号院-1号楼-1单元-101
lamdTest-真实操作前的操作
王大户
lamdTest-真实操作前的操作
2年
lamdTest-真实操作前的操作
9000