java代理 静态代理 动态代理 详解
程序员文章站
2022-06-17 19:59:29
...
• Java代理:静态代理和动态代理
• 静态代理
–代理对象持有目标对象的句柄
–所有调用目标对象的方法,都调用代理对象的方法
–对每个方法,需要静态编码(理解简单,但代码繁琐)
–见StaticProxy.java
interface Subject{
default void request(){
System.out.println("default ");
}
}
class Entity implements Subject{
public void request(){
System.out.println("dealing the request");
}
}
public class StaticProxy implements Subject{//与目标对象实现相同接口
private Subject subject;//静态代理拥有实际目标对象的句柄,这里用超类表示
public StaticProxy(Subject subject){
this.subject=subject;
}
public void request(){//静态代理可以对代理服务做相应处理
System.out.println("------------before-----------");
subject.request();
System.out.println("------------after-------------");
}
public static void main(String[] args) {
Entity e1=new Entity();
StaticProxy sp=new StaticProxy(e1);
sp.request();
}
}
输出结果:
• 动态代理
–对目标对象的方法每次被调用,进行动态拦截
• 动态代理的实现
• 代理处理器
–持有目标对象的句柄
–实现InvocationHandler接口
• 实现invoke方法
• 所有的代理对象方法调用,都会转发到invoke方法来
• invoke的形参method,就是指代理对象方法的调用
• 在invoke内部,可以根据method,使用目标对象不同的方法来响应请求
见ProxyHandler.java
interface Subject{
public void request();
}
class SubjectImpl implements Subject{
@Override
public void request() {
System.out.println("dealing the request");
}
}
public class ProxyHandler implements InvocationHandler {
private Subject subject;
public ProxyHandler(Subject subject){
this.subject=subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//实现invoke()方法
System.out.println(proxy.getClass().getName());//打印代理对象的名字
System.out.println("-------------before-----------");
Object result=method.invoke(subject,args);
System.out.println("-------------after-------------");
return result;
}
public static void main(String[] args) {
SubjectImpl realSubject=new SubjectImpl();
ProxyHandler handler=new ProxyHandler(realSubject);
//利用反射动态加载代理对象
Subject proxySubject=
(Subject) Proxy.newProxyInstance(SubjectImpl.class.getClassLoader(),SubjectImpl.class.getInterfaces(),handler);
proxySubject.request();
}
}
输出结果:
注:转载需注明出处。
上一篇: 解析移动领域的热门词汇:NFC和物联网
下一篇: Sqoop