通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端得到这个代理对象后,就像得到真实对象一样,操作这个代理对象时,实际上的功能还是依靠真实对象来完成,只不过是通过代理操作的,即,客户端操作代理,代理操作真正的对象。这样代理就如同一个中转,中转前后可以做很多事,判断权限,判断其它条件等。
代理接口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
}
}
分享到:
相关推荐
Lotus Domino Java 代理获取传递值 JSON Lotus Domino 是一种基于Notes技术的服务器端应用程序, Lotus Domino Java 代理是指在 Domino 服务器上运行的 Java 代理程序,可以用来处理用户请求、提供数据服务等。今天...
Lotus Domino是一个企业级的应用开发平台,而Java代理在Lotus Domino中被用来处理服务器端的任务,例如数据处理、业务逻辑或响应HTTP请求。在这个特定的案例中,`JQueryReportToolJavaAgent`是一个Java代理,它被...
在Lotus Domino开发环境中,Java代理是用于执行服务器端任务的重要工具,它们可以自动化许多功能,如处理数据、发送邮件等。"lotus domnio java代理传值"这个主题主要涉及如何在Java代码中创建和使用代理,并在代理...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
本教程将聚焦于如何利用Java代理来实现Excel文档的导出。 Lotus Domino是一款强大的协作软件,它提供了丰富的开发环境,包括服务器端的LotusScript和客户端的JavaScript,但在此场景下,我们使用的是Java代理,因为...
在 Lotus Domino 中,Java 代理是可以运行在 Domino 服务器上的小程序,它可以执行特定的任务,如获取当前用户名。 在 Java 代理中,获取当前用户名是一个常见的需求。 Lotus Domino 提供了多种方式来获取当前...
Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...
Java代理模式 事例很生动,非常容易理解,推荐给大家。
java 代理服务源码 测试通过可以,可以自己修改成为自己的代理类。
Java代理服务器程序是一种用于转发网络请求的应用,它在客户端与目标服务器之间起到中介的作用。这样的设计使得用户可以通过代理服务器访问互联网,从而实现多种功能,如匿名浏览、负载均衡、缓存优化、网络监控等。...
Java代理机制是Java编程中一个重要的特性,它允许我们在不修改原有代码的基础上,为已有类增加额外的功能。本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口...
Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...
通过深入理解这两种代理方式,开发者可以更好地利用Java代理机制来优化代码结构,实现更复杂的业务需求。在实际项目中,结合AOP框架如Spring AOP,可以进一步简化代理的使用,提高代码的可维护性和复用性。
Java代理是一种在运行时增强或拦截对象方法调用的技术,它可以让我们在不修改原有代码的情况下,为类添加新的功能或行为。在Java中,代理主要分为两种:静态代理和动态代理。静态代理是通过手动创建代理类来实现的,...
### Java 代理模式详解 #### 1. 代理模式概览 代理模式是一种设计模式,主要目的是为了控制或提供对某对象的访问。在代理模式中,代理对象充当客户端与真实对象之间的中介,使得客户端可以通过代理对象间接地访问...
Lotusscript java代理自动下载指定路径文件。可批量下载指定路径
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在不影响原始对象功能的基础上,增强或扩展其行为。代理模式在软件开发中广泛应用,例如用于权限控制、事务管理、日志记录等场景。...
总结一下,Java代理模式的核心在于`Proxy`类和`InvocationHandler`接口,它们共同实现了在运行时动态创建符合特定接口的代理对象。通过代理,我们可以在不修改原始对象代码的情况下,添加额外的功能或者控制对原始...