java动态代理_Java动态代理

java动态代理

代理是一种设计模式。 当我们想添加或修改现有类的某些功能时,我们创建并使用代理对象。 使用代理对象而不是原始对象。 通常,代理对象具有与原始对象相同的方法,并且在Java代理类中,通常会extend原始类。 代理具有原始对象的句柄,并可以在该对象上调用方法。

这样,代理类可以以便捷的方式实现许多事情:

  • 在方法开始和停止时记录
  • 对参数进行额外检查
  • 嘲笑原始类的行为
  • 实现对昂贵资源的懒惰访问

无需修改该类的原始代码。 (以上列表并不广泛,仅是示例。)

在实际应用中,代理类不会直接实现功能。 遵循单责任原则,代理类仅进行代理,并且实际的行为修改在处理程序中实现。 当调用代理对象而不是原始对象时,代理将决定是否必须调用原始方法或某些处理程序。 处理程序可以执行其任务,也可以调用原始方法。

即使代理模式不仅适用于在运行时创建代理对象和代理Cass的情况,但这在Java中也是一个特别有趣的话题。 在本文中,我将重点介绍这些代理。

这是一个高级主题,因为它需要使用反射类,或者字节代码操作或编译动态生成的Java代码。 或所有这些。 要使新类在运行时还不能用作字节码,将需要生成字节码,并需要一个用于加载字节码的类加载器。 要创建字节码,可以使用cglib或bytebuddy或内置的Java编译器。

当我们考虑代理类及其调用的处理程序时,我们可以理解为什么在这种情况下责任分离很重要。 代理类是在运行时生成的,但是可以将代理类调用的处理程序编码为常规源代码,并沿着整个程序的代码进行编译(编译时)。

最简单的方法是使用java.lang.reflect.Proxy类,它是JDK的一部分。 该类可以创建一个代理类或直接创建它的一个实例。 Java内置代理的使用很容易。 您需要做的就是实现一个java.lang.InvocationHandler以便代理对象可以调用它。 InvocationHandler接口非常简单。 它仅包含一个方法: invoke()invoke() ,参数包含被代理的原始对象,被调用的方法(作为反射Method对象)和原始参数的对象数组。 示例代码演示了用法:

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class JdkProxyDemo {interface If {void originalMethod(String s);}static class Original implements If {public void originalMethod(String s) {System.out.println(s);}}static class Handler implements InvocationHandler {private final If original;public Handler(If original) {this.original = original;}public Object invoke(Object proxy, Method method, Object[] args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException {System.out.println("BEFORE");method.invoke(original, args);System.out.println("AFTER");return null;}}public static void main(String[] args){Original original = new Original();Handler handler = new Handler(original);If f = (If) Proxy.newProxyInstance(If.class.getClassLoader(),new Class[] { If.class },handler);f.originalMethod("Hallo");}}

如果处理程序想要在原始对象上调用原始方法,则它必须有权访问它。 Java代理实现未提供此功能。 您必须自己在代码中将此参数传递给处理程序实例。 (请注意,有一个通常称为proxy的对象作为参数传递给调用处理程序。这是Java反射动态生成的代理对象,而不是我们要代理的对象。)这样,您绝对可以使用单独的对象每个原始类的处理程序对象,或者使用某种共享对象,这些共享对象恰好知道某种方式(如果有任何要调用的方法)来调用哪个原始对象。

作为一种特殊情况,您可以创建一个调用处理程序和一个没有任何原始对象的接口的代理。 甚至不需要任何类来实现源代码中的接口。 动态创建的代理类将实现该接口。

如果要代理的类未实现接口,该怎么办? 在这种情况下,您必须使用其他代理实现。 我们将在下周讨论一下。

翻译自: https://www.javacodegeeks.com/2016/01/java-dynamic-proxy.html

java动态代理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建立能持续处理请求的Server端改造

#include<iostream> #include<Windows.h> using namespace std;int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOCKET _sock ::socket(AF_INET, SOCK_STREAM,…

basemap安装_【我是解决安装问题系列_1】Mac python basemap安装

「2020/3/21更新」 附basemap网盘下载地址⏬Python需要跳过的安装的坑太太太太多了!!!!!最近看《利用python进行数据分析》这本书&#xff0c;到可视化的部分&#xff0c;看着最后的例子地图挺酷炫的&#xff0c;跟着敲代码的过程中&#xff0c;发现有时候不是你不会写&#xf…

nfs服务器远程访问,NFS远程共享存储

原标题&#xff1a;NFS远程共享存储构建储NFS远程共享存因为NFS有很多功能&#xff0c;不同的功能需要使用不同的端口。因此NFS无法固定端口。而RPC会记录NFS端口的信息&#xff0c;这样就能够通过RPC实现服务端和客户端的RPC来沟通端口信息。那RPC和NFS之间又是如何之间相互通…

chameleon 算法_使用Chameleon,Shrinkwrap,Drone / Graphene与Arquillian进行Java EE集成测试...

chameleon 算法从我以前的帖子继续在这里 &#xff0c;我想我已经了解了Java EE和也的Arquillian&#xff0c;并测试了一些新的&#xff08;和令人兴奋的&#xff09;事&#xff0c;我想与大家分享。 但是&#xff0c;在开始之前&#xff0c;我想首先请您注意以下几点&#xf…

建立能持续处理请求的Client端改造

#include<iostream> #include<Windows.h> using namespace std;int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOCKET _sock ::socket(AF_INET, SOCK_STREAM,…

comparator 字符串比较大小_Java8 - 使用 Comparator.comparing 进行比较排序

使用外部比较器Comparator进行排序 当我们需要对集合的元素进行排序的时候,可以使用java.util.Comparator 创建一个比较器来进行排序。Comparator接口同样也是一个函数式接口,我们可以把使用lambda表达式。如下示例, package com.common; import java.util.*; import java.u…

ntp服务器查看终端,使用命令行界面使用NTP服务器在Windows中同步时间 | MOS86

即使使用简单的3V锂电池(CR2032)关闭电脑&#xff0c;每台台式电脑也能保持正确的时间。但这不是一个可充电电池&#xff0c;所以一年左右就停止工作了。您可以轻松地替换此单元格&#xff0c;但更换单元后&#xff0c;必须使用NTP服务器更新时间&#xff0c;以便Windows PC保持…

java 中的指针_Java中的指针

java 中的指针Java中有指针吗&#xff1f; 简短的答案是“不&#xff0c;没有”&#xff0c;这对于许多开发人员来说似乎是显而易见的。 但是&#xff0c;为什么对其他人却不那么明显呢&#xff1f; http://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-ja…

发送结构化网络数据Server端

#include<iostream> #include<Windows.h> using namespace std;struct DataPack {int age;char name[32];};int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOC…

concat合并的数组会有顺序么_JS 数组操作 记录 笔记

Array数组的方法Mutator方法————"突变方法"会改变数组自身的值&#xff1b;Accessor方法————"访问方法"不会改变数组自身的值&#xff1b;Iteration方法————"遍历的方法" Establish方法————"创建新方法"Mutator方法(会…

工厂模式理解_工厂模式

工厂模式理解工厂模式是一种创新的设计模式&#xff0c;其目的是提供一个接口&#xff0c;用于创建相关或相关对象的族&#xff0c;而无需指定其具体类。 创建逻辑封装在工厂中&#xff0c;该工厂提供创建逻辑的方法或将对象的创建委托给子类。 客户端不知道接口或类的不同实现…

服务器双向认证 原理,什么叫SSL双向认证 SSL双向认证过程是怎样的

我们都知道SSL认证能够分成SSL双向认证和SSL单向认证。那么&#xff0c;什么是SSL双向认证&#xff1f;SSL双向认证过程又是怎样的&#xff1f;小编就在接下来的内容为各位详细讲述。什么叫SSL双向认证SSL双向认证则是需要是服务端需要客户端提供身份认证&#xff0c;只能是服务…

发送结构化数据Client端

#include<iostream> #include<Windows.h> using namespace std;struct DataPack {int age;char name[32];};int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOC…

依赖: ros-melodic-desktop 但是它将不会被安装_npm系列之依赖管理

1. 版本控制npm依赖包使用语义化的版本号&#xff0c;让开发者可以从版本号中推测修改。版本号格式为&#xff1a;X.Y.ZX&#xff1a;代表主版本号&#xff0c;只有更新了不向下兼容的API时才需要修改Y&#xff1a;次版本号&#xff0c;当模块增加了向下兼容的功能时需要修改Z&…

java编写代理服务器_如何编写Java代理

java编写代理服务器对于vmlens &#xff08;轻量级Java竞争条件捕获器&#xff09;&#xff0c;我们使用Java代理来跟踪字段访问。 这是我们学习的实现此类代理的经验教训。 开始 使用“静态公共静态无效值premain&#xff08;String args&#xff0c;Instrumentation inst&am…

怎么修改ipv4服务器,如何修改ipv4 wins 服务器地址

如何修改ipv4 wins 服务器地址 内容精选换一换IPv6的使用&#xff0c;可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4&#xff0c;那么启用IPv6后&#xff0c;云服务器可在双栈模式下运行&#xff0c;即云服务器可以拥有两个不同版本的IP地址&#xff1a;I…

C++ 【随想录】(二)指针常量与常量指针精解【一次掌握】

关于指针常量和常量指针 const int *x int *const y 在前先读&#xff0c;在前不变 *&#xff08;指针&#xff09;和const(常量&#xff09;谁在前先读谁&#xff1b; *代表被指的数据&#xff0c;名字代表指针地址 const在谁前谁不变

python 追加到字典_使用Python读取,写入和解析JSON

JSON是用于数据交换的轻量级数据格式&#xff0c;可以很容易地被人类读取和写入&#xff0c;也可以由机器轻松解析和生成。它是一种完全独立于语言的文本格式。为了处理JSON数据&#xff0c;Python有一个名为的内置包json。示例&#xff1a; s {“ id”&#xff1a;01&#xff…

couchbase_适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

couchbase该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序。 这将使用Docker Machine&#xff0c;Swarm和Compose实现。 是的&#xff0c;这三个工具一起使这个博客变得更加有趣&#xff01; 该图说明了关键组件&#xff1a; Docker Machine用于配置多个D…

云服务器可以文件服务器,云服务器 可以上传文件

云服务器 可以上传文件 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使…