静态代理、动态代理
程序员文章站
2022-06-10 20:49:21
...
静态代理:基于接口,一个静态代理只能代理一个类
interface ISubject {//真实业务
void eat();
}
class RealSubject implements ISubject {//真实对象
@Override
public void eat() {
System.out.println("吃饭");
}
}
public class ProxySubject implements ISubject {//代理对象
public ISubject iSubject;//代理的真实对象
public ProxySubject(ISubject iSubject) {
this.iSubject = iSubject;
}
//代理对象额外添加的业务
public void before() {
System.out.println("出门");
}
public void after() {
System.out.println("回家");
}
@Override
public void eat() {
before();
this.iSubject.eat();//真实对象的业务
after();
}
public static void main(String[] args) {
ProxySubject proxySubject=new ProxySubject(new RealSubject());
proxySubject.eat();
}
}
动态代理:一个代理类代理了所有类似接口,而不再是具体实现一个接口
interface ISubject {//真实业务
void eat();
}
class RealSubject implements ISubject {//真实对象
@Override
public void eat() {
System.out.println("吃饭");
}
}
public class Prox implements InvocationHandler {//实现InvocationHandler接口
/*目标对象*/
public Object target;
/*,自己写的一个方法,目的是帮助我们生成代理对象*/
public Object newInstance(Object object){
this.target=object;
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
this.target.getClass().getInterfaces(),this);
}
/*
* proxy:目标对象
*method:目标对象中的方法
*args:目标对象方法中的参数
* 该方法是由系统自动调用的,不是自己调用的
* */
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object object=method.invoke(this.target,args);//反射的方式实现某个对象的方法调用
after();
return object;
}
public void before(){
System.out.println("打扮");
}
public void after(){
System.out.println("购物");
}
public static void main(String[] args) {
ISubject prox= (ISubject) new Prox().newInstance(new RealSubject());
prox.eat();
}
}
进行动态代理的实现,代理类不再具体实现一个接口,而是实现InvocationHqandler接口。
其中代码中
Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
this.target.getClass().getInterfaces(),this);
调用的是
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)方法
ClassLoader loader:目标对象(target)的类加载器,通过反射就能知道该类的信息了
Class<?>[] interfaces:目标对象(target)所实现的接口,即就能知道目标对象的主营业务了
InvocationHandler h:代表的是实现了InvocationHandler 那个接口的类,在该代码中局势Prox 这个类
其中invoke方法是系统来调用的,不是谁来调用的
上一篇: 代理(静态代理、动态代理)
下一篇: Win32多线程之线程挂起**结束