代理分为静态代理和动态代理。代理就想找局长办事,你不认识局长,但你认识局长秘书,你可以找局长秘书来完成对局长的操作。
代理模式一般涉及到的角色有
§抽象角色:声明真实对象和代理对象的共同接口
§代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
§真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
静态代理:
// 抽象角色
abstract public class Subject
{
abstract public void request();
}
//真实角色:实现了Subject的request()方法
public class RealSubject extends Subject
{
public RealSubject()
{
}
public void request()
{
System.out.println("From real subject.");
}
}
//代理角色
public class ProxySubject extends Subject
{
private RealSubject realSubject; // 以真实角色作为代理角色的属性
public ProxySubject()
{
}
public void request() // 该方法封装了真实对象的request方法
{
preRequest();
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.request(); // 此处执行真实对象的request方法
postRequest();
}
private void preRequest()
{
// something you want to do before requesting
}
private void postRequest()
{
// something you want to do after requesting
}
}
//客户端调用
public class Client
{
public static void main(String[] args)
{
Subject sub = new ProxySubject();
sub.request();
}
}
动态代理:
动态代理步骤:
1.创建一个实现接口InvocationHandler的类,它必须实现invoke方法
2.创建被代理的类以及接口
3.通过Proxy的静态方法
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理
4.通过代理调用方法
//抽象角色(之前是抽象类,此处应改为接口):
public interface Subject
{
abstract public void request();
}
//具体角色
public class RealSubject implements Subject
{
public RealSubject()
{
}
public void request()
{
System.out.println("From real subject.");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//代理处理器
/**
* 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;
* 此外,在该类还实现了invoke方法,该方法中的 method.invoke(sub,args);
* 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,
* args为执行被代理对象相应操作所需的参数。
* 通过动态代理类,我们可以在调用之前或之后执行一些相关操作
*/
public class DynamicSubject implements InvocationHandler
{
private Object sub;
public DynamicSubject()
{
}
public DynamicSubject(Object obj)
{
sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
System.out.println("before calling " + method);
method.invoke(sub, args);
System.out.println("after calling " + method);
return null;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
//客户端
public class Client
{
static public void main(String[] args) throws Throwable
{
RealSubject rs = new RealSubject(); // 在这里指定被代理类
InvocationHandler ds = new DynamicSubject(rs);
Class<?> cls = rs.getClass();
// 以下是一次性生成代理
Subject subject = (Subject) Proxy.newProxyInstance(
cls.getClassLoader(), cls.getInterfaces(), ds);
subject.request();
}
}
分享到:
相关推荐
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
本资源包含了博主博客中的代码,用一个黄牛买票的例子帮助新手理解静态代理与动态代理的原理
NULL 博文链接:https://liaoliu51.iteye.com/blog/581896
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { super(); ...
java静态代理和动态代理的区别,及其例子
这是一个基于spring AOP静态代理模拟的案例,可以更好的理解spring的aop作用
动态代理的代码例子 里面敲好了注释 搭配文章观看更好
一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进
对代理模式的介绍,静态代理,JDK动态代理,CGLIB动态代理的介绍,例子
静态代理demo,可以参考一下。这个是一个静态代理的例子。
两个示例都调用实例化视图类的 render 方法,静态代理版本使用简洁和干净的代码。 这可能是也可能不是一件好事,完全取决于您的要求、用法和观点。这个怎么运作一切都通过Statical\Manager运行。 创建每个静态代理...
示例(1)静态代理(2)动态代理3. 通用类图4. 代理模式的优点二、jdk动态代理实现原理1. jdk动态代理源码分析(通过该示例学会阅读源码的方法)2.jdk动态代理生成的代理类的源码3.总结三、手写实现jdk动态代理 一、...
java中代理的使用,包括静态代理、JDK动态代理、CGLIB动态代理的例子,想了解AOP和动态代理的童鞋可以看下
例子 { " proxies " : [ { " context " : " /api " , " config " : { " target " : " http://example.com " , " changeOrigin " : true } } ], " port " : 8080 , " logLevel " : " dev
本文实例讲述了JavaScript代理模式原理与...具体看下面的例子 第一,普通代理模式 步骤一,接口检验文件的引用 //定义一个静态方法来实现接口与实现类的直接检验 //静态方法不要写出Interface.prototype ,因为这是写
本文实例讲述了JavaScript设计模式之代理...具体看下面的例子 第一,普通代理模式 步骤一,接口检验文件的引用 //定义一个静态方法来实现接口与实现类的直接检验 //静态方法不要写出Interface.prototype ,因为这是写
这是一个demo,里面包含静态包含和动态包含的例子 使用这个demo进行不断调试,查看JDk内部代码,了解代理内部原理 参考这篇文章学习更轻松:https://blog.csdn.net/qq_42276808/article/details/110495122
网络应用程序,它通常代理实时或静态数据集。 它通过 URL 端点和规范化的 JSON 接口公开您的数据集。 静态数据集 - Dataportal 将 JSON 静态文件加载到 MongoDB 并使其可动态搜索。 远程数据集 - Dataportal 提供了...