AOP底层,将一些与业务逻辑无关的共有操作分离
1、静态代理
public class ProxyPatternDemo {
public static void main(String[] args) {
Landlord landlord = new Landlord();
Agency agency = new Agency(landlord);
agency.rent();
}
}
// 真实角色
class Landlord implements Rent{
@Override
public void rent() {
System.out.println("Landlord doing");
}
}
// 代理角色
@AllArgsConstructor
class Agency implements Rent {
// 组合
private Landlord landlord;
@Override
public void rent() {
System.out.println("agency doing before");
landlord.rent();
System.out.println("agency doing after");
}
}
// 抽象的操作
interface Rent{
public void rent();
}
- 为什么jdk代理的类必须实现接口
2、动态代理
2.1 JDK动态代理,基于接口 通过反射
public class ProxyPatternDemo {
public static void main(String[] args) {
// 真实角色
Rent rent = new Landlord();
AgencyInvocationHandler agency = new AgencyInvocationHandler();
agency.setRent(rent);
// 生成代理类 代理角色
Rent proxy = (Rent) agency.getProxy();
proxy.rent();
}
}
class AgencyInvocationHandler implements InvocationHandler {
// 被代理类
private Object target;
public void setRent(Object target) {
this.target = target;
}
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("agency doing before");
Object result = method.invoke(target, args);
System.out.println("agency doing before");
return result;
}
}
//真实角色
class Landlord implements Rent{
@Override
public void rent() {
System.out.println("Landlord doing");
}
}
//抽象的操作
interface Rent{
public void rent();
}
- 为什么jdk动态代理只能代理实现接口的类