通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,就像得到真实对象一样,操作这个代理对象时,实际上的功能还是依靠真实对象来完成,只不过是通过代理操作的,即,客户端操作代理,代理操作真正的对象。这样代理就如同一个中转,中转前后可以做很多事,判断权限,判断其它条件等。
代理接口Subject
package com.dev.model.proxy.staticProxy;
/**
* 静态代理接口
* @author Hust
* @Time 2011-11-5
*/
public interface Subject {
void doSomeThing();
}
被代理的目标对象RealSubject类
实现Subject接口
package com.dev.model.proxy.staticProxy;
/**
* 静态代理实现类,被代理的目标对象
* @author Hust
* @Time 2011-11-5
*/
public class RealSubject implements Subject {
/**
* 示例方法
*/
@Override
public void doSomeThing() {
System.out.println(" in " + RealSubject.class);
}
}
实现一:静态代理
代理对象ProxySubject类
package com.dev.model.proxy.staticProxy;
/**
* 代理对象
* @author Hust
* @Time 2011-11-5
*/
public class ProxySubject implements Subject {
private Subject real = null; //持有被代理的具体的目标对象
public ProxySubject(Subject sub){//构造方法传入被代理的目标对象
real = sub;
}
@Override
public void doSomeThing() {
//可以在这里加些权限或者其它数据完整性的判断,如果通过则继续
before(); //有点像前置通知
if(null != real)
real.doSomeThing();
end(); //有点像后置通知
}
public void before(){
System.out.println("in" +ProxySubject.class+" before() ");
}
public void end(){
System.out.println("in" +ProxySubject.class+" end() ");
}
}
测试TestStaticProxy类
package com.dev.model.proxy.staticProxy;
/**
* 测试
* @author Hust
* @Time 2011-11-5
*/
public class TestStaticProxy {
public static void main(String[] args) {
RealSubject rs = new RealSubject();
ProxySubject ps = new ProxySubject(rs);
ps.doSomeThing();
/*** 调用 结果
inclass com.dev.model.proxy.staticProxy.ProxySubject before()
in class com.dev.model.proxy.staticProxy.RealSubject
inclass com.dev.model.proxy.staticProxy.ProxySubject end()
*/
}
}
实现二:JDK动态代理
DynamicProxy类
package com.dev.model.proxy.javaproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.dev.model.proxy.staticProxy.RealSubject;
import com.dev.model.proxy.staticProxy.Subject;
/**
* java动态代理
* @author Hust
* @Time 2011-11-6
*/
public class DynamicProxy implements InvocationHandler {
private Subject sb = null;
public DynamicProxy(Subject sb){
this.sb = sb;
}
public Subject getProxyInterface(RealSubject rs){
//设置被代理对象,方便invoke操作
this.sb = rs ;
//将真正的订单对象和动态关联起来
Subject sub = (Subject)Proxy.newProxyInstance(
RealSubject.class.getClassLoader(),
RealSubject.class.getInterfaces(),
this);
return sub;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//if(method.getName().startsWith(""))
return method.invoke(sb, args);
}
}
测试:DynamicTest
package com.dev.model.proxy.javaproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import com.dev.model.proxy.staticProxy.RealSubject;
import com.dev.model.proxy.staticProxy.Subject;
/**
* 测试
* 代理模式:控制对象访问
* @author Hust
* @Time 2011-11-6
*/
public class DynamicTest {
public static void main(String[] args) {
//testProxy1();
testProxy2();
}
public static void testProxy2(){
RealSubject rs = new RealSubject();
DynamicProxy dp = new DynamicProxy(rs);
Subject sb = dp.getProxyInterface(rs);
sb.doSomeThing();// in class com.dev.model.proxy.staticProxy.RealSubject
}
public static void testProxy1(){
RealSubject rs = new RealSubject();
InvocationHandler ich = new DynamicProxy(rs);
Subject sub = (Subject)Proxy.newProxyInstance(ich.getClass().getClassLoader(), rs.getClass().getInterfaces(), ich);
sub.doSomeThing();// in class com.dev.model.proxy.staticProxy.RealSubject
}
}
分享到:
相关推荐
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
lotus domino java代理_获取传递值json
Java代理服务器的实现Java代理服务器的实现
Java代理模式 事例很生动,非常容易理解,推荐给大家。
lotus domnio java代理输出html代理
java 代理服务源码 测试通过可以,可以自己修改成为自己的代理类。
lotus domnio java代理传值
Domino JAVA代理培训 目录: 表单:存储前台显示页面、后台数据; 视图:根据表单数据、筛选条件列出相符的文档列表; 子表单:只能被表单调用,相当于include子程序; 代理、公式:后台处理程序,对数据存储、数据...
lotus domnio java代理获取当前用户名
java代理模式
lotus Domino BS开发 通过java 代理导出excel.doc
Java 代理 - Java 代理 - 代理模式 - 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java ...
转;Domino_java代理实现FTP上传下载
JAVA,代理服务器,JAVA代理服务器 本小工具是使用JAVA开发的代理服务器,只要设置好代理端口(端口在100~65000之内的任意没被占用的端口都可以),点击启动,局域网内用户就可以设置通过代理联网
Lotusscript java代理自动下载指定路径文件。可批量下载指定路径
java静态代理设计模式,学习记录,简单自定义注解编写
java代理机制 JDK动态代理和cglib代理 详解
一个比较完善的Java代理服务器程序,里面代码其全,结构清晰,值得研究。
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。