动态代理
1.动态代理和静态代理的觉角色一样
2.动态代理的代理类是动态生成的不是我们直接写好的
3.动态代理分为两大类:基于接口的动态代理,基于类的动态代理
- 基于接口—jdk动态代理
- 基于类的动态代理—cglib
- java字节码实现:javassist(JBoss服务器) 优点:简单快速
4.jdk动态代理的两个类:Proxy:代理,InvocationHandler:调用处理程序(反射包下的接口)
实现InvocationHandler接口,实现invoke方法,在invoke方法中调用需要代理的方法(反射),然后需要返回一个Proxy对象,我们只需要的到这个Proxy对象就可以调用增强过的方法了。
接口:
public class Client
{
public static void main(String[] args) {
Host host = new Host();
MyProxy myProxy = new MyProxy(host);
Rent proxy = (Rent)myProxy.getProxy();
proxy.getHouse();
}
}
房东:
public class Host implements Rent{
@Override
public void getHouse() {
System.out.println("房东收钱了");
}
}
代理类:
public class MyProxy implements InvocationHandler {
private Rent rent;
MyProxy (Rent rent)
{
this.rent = rent;
}
public Object getProxy()
{
//固定这样写
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
}
//调用代理对象的方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("中介处理完工作了");
Object result = method.invoke(rent, args);
return result;
}
}
调用:
public class Client
{
public static void main(String[] args) {
Host host = new Host();
MyProxy myProxy = new MyProxy(host);
Rent proxy = (Rent)myProxy.getProxy();
proxy.getHouse();
}
}
结果:
中介处理完工作了
房东收钱了
通用代理类:
public class MyProxy implements InvocationHandler {
private Object target;
MyProxy (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("中介处理完工作了");
Object result = method.invoke(target, args);
return result;
}
}
结果:
中介处理完工作了
房东收钱了
总结:
我们通过这个接口就可以传入任何接口的实现类,来实现代理,但是我们只用写一个类。