打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Java代理模式复习
userphoto

2011.12.16

关注

Java代理模式复习


1.代理模式:为一个对象提供一个替身或者占位符以控制对这个对象的访问


@Subject接口

package com.flynewton.proxy.test;

/**
* TODO Comment of Subject
* @author flynewton
*
*/
public interface Subject {
void operation(String arg);
}

@RealSubject类

package com.flynewton.proxy.test;

/**
* TODO Comment of RealSubject
* @author flynewton
*
*/
public class RealSubject implements Subject {

/* (non-Javadoc)
* @see com.flynewton.proxy.test.Subject#operation(java.lang.String)
*/
@Override
public void operation(String arg) {
System.out.println("实际操作, 参数:" + arg);
}

}

@ProxySubject类

package com.flynewton.proxy.test;

/**
* TODO Comment of ProxySubject
* @author flynewton
*
*/
public class ProxySubject implements Subject {

private Subject beProxy;

public ProxySubject(Subject beProxy) {
this.beProxy = beProxy;
}

/* (non-Javadoc)
* @see com.flynewton.proxy.test.Subject#operation(java.lang.String)
*/
@Override
public void operation(String arg) {
System.out.println("代理操作, 参数:" + arg);
beProxy.operation(arg);
}

}

@测试类:

package com.flynewton.proxy.test;

/**
* TODO Comment of TestProxy
* @author flynewton
*
*/
public class TestProxy {

public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);

System.out.println("===Without Proxy===");
doSomething(realSubject);

System.out.println("===With Proxy======");
doSomething(proxySubject);
}

public static void doSomething(Subject subject){
subject.operation("flynewton");
}
}

@测试结果:

===Without Proxy===
实际操作,参数:flynewton
===With Proxy======
代理操作,参数:flynewton
实际操作,参数:flynewton

 

2.Java动态代理

Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

(1).Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。

(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:

Protected Proxy(InvocationHandler h):构造函数,估计用于给内部的h赋值。

Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。

Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

@ProxyHandler类

package com.flynewton.proxy.test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
* TODO Comment of ProxyHandler
* @author flynewton
*
*/
public class ProxyHandler implements InvocationHandler {

private Object beProxy;

/**
* @param beProxy
*/
public ProxyHandler(Object beProxy) {
super();
this.beProxy = beProxy;
}

/* (non-Javadoc)
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理类: " + proxy.getClass() + "\n被代理方法: " + method + "\n参数: " + args);
return method.invoke(beProxy, args);
}

}

@测试类:

package com.flynewton.proxy.test;

import java.lang.reflect.Proxy;

/**
* TODO Comment of TestDynamicProxy
*
* @author flynewton
*/
public class TestDynamicProxy {

/**
* @param args
*/
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Subject proxySubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
new Class[] { Subject.class }, new ProxyHandler(realSubject));

System.out.println("===Without Proxy===");
doSomething(realSubject);

System.out.println("===With Proxy======");
doSomething(proxySubject);
}

public static void doSomething(Subject subject) {
subject.operation("flynewton");
}
}

测试结果:

===Without Proxy===
实际操作, 参数:flynewton
===With Proxy======
代理类: class $Proxy0
被代理方法: public abstract void com.flynewton.proxy.test.Subject.operation(java.lang.String)
参数: [Ljava.lang.Object;@1034bb5
实际操作, 参数:flynewton

本文学习并修改自:http://zhangjunhd.blog.51cto.com/113473/69996

关键字: Java , Proxy , 代理模式 , 动态代理

(###)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于java的动态代理
struts2学习笔记(8)——拦截器原理
代理模式——结构型模式(7)
代理模式
彻底理解JAVA动态代理
动态代理proxy与CGLib的区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服