java代理

2023-11-18

静态代理

import java.util.logging.Level;
import java.util.logging.Logger;
//定义接口,代理类和被代理类都要实现这个接口
interface IHello {
public void hello (String name) ;
}
//被代理类
class HelloSpeaker implements IHello {
public void hello(String name) {
   System.out.println("hello:"+name);
}
}
//代理类
class HelloProxy implements IHello {
private Logger logger = Logger.getLogger(this.getClass().getName());
private IHello helloObject;

public HelloProxy(IHello helloObject) {
   this.helloObject = helloObject;
}
@Override
public void hello(String name ){
   log("hello method starts...");
   helloObject.hello(name);
   log("hello method ends...");
}
private void log(String msg) {
   logger.log(Level.INFO,msg);
}
}
//测试类
public class ProxyTest {

public static void main(String[] args) {
   IHello proxy = new HelloProxy(new HelloSpeaker());
   proxy.hello("Ericiverson");
}
}
       对于运行结果需要提醒的是,代理对象的业务逻辑(这里就是打印出Hello,Justin)和
日志等事物的执行是由两个线程执行的,所以结果也可能是日志信息先出现,再打印字符。
简单总结一下,静态代理要求代理对象和被代理对象都实现同一个接口。执行的时候执
行的是代理对象,但代理对象调用了被代理对象,这样业务逻辑实际上是由被代理对象提供
的,代理对象只是作为一个载体而已。
静态代理的缺陷就在于必须实现同一个接口,在程序规模稍大时就无法胜任。这里通过这个
例子来了解代理工作的基本原理。

动态代理:

从JDK1.3 开始,Java提供了可以开发动态代理的API。动态代理和静态代理的区别,
就是动态代理中的代理类是由java.lang.reflect.Proxy类在运行期时根据接口定义,采用Java
反射功能动态生成的。
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method
method, Object[] args)。
(2).Proxy:该类即为动态代理类,其中主要包含以下内容:
l Protected Proxy(InvocationHandler h)
l Static Class getProxyClass (ClassLoader loader, Class[] interfaces)
l Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须
提供一组interface给它,然后该class 就宣称它实现了这些interface。你当然可以把该class
的实例当作这些interface 中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个
Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管
实际的工作。
我们采取研究代码的方式来理解动态代理API的内容。
下面的代码定义了一个LogHandler类,它是一个代理类,提供日志的有关功能。这个
类是个动态代理类,对应动态代理类要求必须实现InvocationHandler接口,并overriding该
接口中定义的invoke()方法。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Level;
import java.util.logging.Logger;

//动态代理 动态代理必须实现InvocationHandler接口
interface IHello {
public void hello (String name) ;
public void sayHello(String name);
}
//被代理类
class HelloSpeaker implements IHello {
public void hello(String name) {
   System.out.println("hello:"+name);
}

@Override
public void sayHello(String name) {
   System.out.println("SayHello:"+name);
}
}
//代理类
class LogHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;

public Object bind(Object delegate) {
   this.delegate = delegate;
   return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),new Class[]{IHello.class},this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
  
    Object result = null;
    log("method starts oyp..."+method);
    result   = method.invoke(delegate, args);
    logger.log(Level.INFO,"method ends oyp..."+method);
   return null;
}
private void log(String message) {
   logger.log(Level.INFO,message);
}
}
//测试类
public class ProxyTestTwo {
public static void main(String[] args) {
   LogHandler logHandler = new LogHandler();
   IHello helloProxy = (IHello)logHandler.bind(new HelloSpeaker());
   helloProxy.hello("1231");
   helloProxy.sayHello("sdfasf");
}
}


http://hi.baidu.com/ou_yang_/blog/item/f44edd13feac6d2bdf540164.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java代理 的相关文章

  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • 在 SWT 中单击鼠标触发事件?

    在SWT中 对于MouseListener接口 可用的方法有mouseUp mouseDown and mouseDoubleClick 如何根据用户点击触发事件 我们可以通过结合来做到这一点mouseUp and mouseDown 但没
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • Tomcat - 多个 webapps 文件夹

    是否可以有多个文件夹来放置要部署的应用程序 这些是如何定义的 是否可以将一个文件夹限制为仅是 domain com 的应用程序 而不是其他域 Thanks 看一眼conf server xml
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • Java 泛型:将 Object o 的类与 进行比较

    假设我有以下课程 public class Test
  • 如何在 JScript 中解码 Base64 字符串

    我必须在 JScript 中解码 Base64 字符串 并且我已经尝试使用此代码来执行目的操作 var xmlDom new ActiveXObject Microsoft XMLDOM var el xmlDom createElemen
  • Visual Studio Code - Java 类路径不完整。只会报告语法错误

    在使用 python 获得了丰富的经验之后 我正在使用 java 迈出第一步 我正在运行的脚本是一个简单的 Java Swing Gui 它可以从命令行和 VS Code 中正常编译和运行 为了设置 java 调试环境 我使用 github
  • Wildfly 10.1 消耗所有核心

    我们最近将银行应用程序从 java 1 6 升级到 1 8 将 jboss 4 x 升级到 wildfly 10 1 我们观察到 java 消耗了机器上可用的所有核心 10 有人可以告诉是什么原因吗 通常情况下 jboss 4 x 的最大
  • 有没有办法处理Java堆空间异常[重复]

    这个问题在这里已经有答案了 我正在寻找将文件输入流转换为大文件 文件大小为 100MB 并且抛出 java lang OutOfMemoryError Java Heap space import java io FileInputStre
  • Java“非法访问操作”方法将被弃用? [复制]

    这个问题在这里已经有答案了 JDK 9 JVM 发出非法访问操作警告后 如果您使用一些非法访问 例如setAccessible 我的问题 Is setAccessible 以后会被封吗 此功能的官方参考 如果将被弃用 在哪里 我在任何地方都
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 将 JSON 发送到 Spring MVC 控制器

    我正在尝试将 JSON 发送到 Spring MVC 控制器 在 Spring MVC 方面 一切都配置正确 下面是代码 但似乎没有运行
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • AJAX 缓存处理

    关于AJAX请求服务器后缓存数据 造成没有及时刷新的问题 最近在做项目的时候 使用了ajax去请求服务器的数据 刚开始还可以 我测试一切运行正常 我不是专业的测试人员哈 所以还是有些问题没有测出来哈 后来ajax请求的数据变化了 但是页面数
  • 设计模式之命令模式

    在日常生活中 我们常常会遇到这样一些问题 需要向某些对象发送请求 但是并不知道请求的接收者是谁 也不知道被请求的操作是哪个 我们只需在程序运行时指定具体的请求接收者即可 此时 可以使用命令模式来进行设计 使得请求发送者与请求接收者消除彼此之
  • react 显示当前时间_react中monent如何获取日期?

    方法 1 使用 npm install moment save 安装moment 2 在组件中使用import语句引入moment 3 使用monent提供的方法来获取日期 例 moment format 获取当前时间 本教程操作环境 wi
  • OneFlow 中的 Softmax

    Softmax 是深度学习模型中的常见算子 PyTorch 的 Softmax 算子直接调用 cuDNN 的接口 而 OneFlow 内部针对输入数据的类别数量 采用3个 kernel 来分别处理 在多数情况下都可以获得比 cuDNN 更优
  • 【Git】(三)回退版本

    1 git reset命令 1 1 回退至上一个版本 git reset hard HEAD 1 2 将本地的状态回退到和远程的一样 git reset hard origin master 注意 谨慎使用 hard 参数 它会删除回退点之
  • redis必杀高级:安全

    题记 我们可以通过 redis 的配置文件设置密码参数 这样客户端连接到 redis 服务就需要密码验证 这样可以让你的 redis 服务更安全 例如 设置密码 查看是否设置了密码验证 127 0 0 1 6379 gt CONFIG ge
  • 【Java日志】你真的知道怎么使用Java日志API吗?

    你真的知道怎么使用Java日志API吗 一 背景 二 Java日志API错误使用示例 1 占位符的错误使用示例 2 异常日志的错误使用示例 三 推荐一个学习Java日志的项目 一 背景 在平时的开发过程中 常常看到一些编码不规范的打印日志的
  • Flask读取RTSP视频流,及其简单的一个案例

    Flask读取RTSP视频流 及其简单的一个案例 此章节包括通过是使用Flask可以实时地显示RTSP视频流 代码确实非常简单 源于Github 主要为为Nvidia Deepstream极致细节 3 Deepstream Python R
  • 华为怎么显示返回按键_华为怎么把返回那三个键调出来

    华为怎么把返回那三个键调出来 其实这个方法一点都不难 1 首先在华为nova3的桌面找到 设置 并点击进入 2 点击打开 系统 3 在系统菜单下 点击进入 系统导航 4 点击勾选 屏幕内虚拟导航栏 即可打开虚拟导航 不勾选即可直接关闭虚拟导
  • vscode配置快捷键注释模板

    文章目录 前言 一 打开配置项 1 首选项编辑配置 2 新建代码片段 3 配置注释文件名 二 新建代码注释模板 三 注释使用 前言 本篇文章可以在vscode中配置快捷键显示代码的信息注释 如作者 描述 创建时间等 一 打开配置项 1 首选
  • SD卡中FAT32文件格式快速入门(图文详细介绍)

    说明 MBR Master Boot Record 主引导记录 DBR DOS Boot Record 引导扇区 FAT File Allocation Table 文件分配表 硬件 本文SD卡为Kingston 4GB FAT32格式 簇
  • 【Python】 Pandas数据导入与导出

    数据读取 import pandas as pd data pd read csv data csv 读取数据文件 print data 数据索引与查看 x data loc x 读取表头为 x 的那一列的数据 print x y data
  • 如何自学现代计算机科学(转)

    简介 这里收集了很多学习资源 都是关于一些适合本科生学习的计算机科学 话题 Topics 这里仅仅只提供 话题 列表 而不会提供诸如知识点剖析 练习题等内容 如果你对某一个话题特别感兴趣 想深入研究一下 但又买不起文中提到的书籍 实体书 那
  • 使用docker搭建FastDFS文件系统

    使用docker搭建FastDFS文件系统 1 拉取fastdfs镜像 docker search fastdfs 这里要选择 delron fastdfs 镜像 docker pull delron fastdfs 2 启动容器 2 1
  • 车祸相关公开数据集(免费下载)

    Vehicle Collisions 纽约市机动车与人相撞 背景描述 这是 2021 年在纽约发生的人与机动车碰撞事故的数据 仅过滤掉超过 1 000 美元的受伤或死亡案件 总结了事件的日期和时间 受伤的位置以及警方对事件的描述 数据说明
  • Dubbo源码分析-Spring与Dubbo整合原理与源码分析(二)

    Spring与Dubbo整合的整体流程 基于apache dubbo 2 7 15 因为dubbo有较多的兼容以前的代码比如 DubboReference 以前就有两个版本 Reference 和 com alibaba dubbo con
  • list 分组_学习笔记系列_10_数据聚合与分组操作

    开篇导包 一 数据聚合 df groupby 详解 DataFrame 参数 by 用作分组的条件对象 mapping function label or list of labels axis 轴方向 0 or index 1 or co
  • Golang笔记:UDP基础使用与广播

    文章目录 目的 基础说明 作为服务器使用 作为客户端使用 广播 总结 目的 UDP是比较基础常用的网络通讯方式 这篇文章将介绍Go语言中UDP基础使用的一些内容 本文中使用 Packet Sender 工具进行测试 其官网地址如下 http
  • 大数据常见错误解决方案(转载)

    1 用 bin spark shell启动spark时遇到异常 java net BindException Can t assign requested address Service sparkDriver failed after 1
  • java代理

    静态代理 import java util logging Level import java util logging Logger 定义接口 代理类和被代理类都要实现这个接口 interface IHello public void h