深入理解java动态代理机制(java静态代理和动态代理的优缺点)

  • 1、java动态代理是什么
  • 2、JAVA动态代理设计原理及如何实现
  • 3、java静态代理与动态代理的区别

import java.lang.reflect.Proxy;

A. 创建一个实现接口InvocationHandler的类,他必须实现invoke方法

B. 创建被代理的类以及接口。

C. 通过Proxy的静态方法newProxyInstance(ClassLoader loader,Class【】interfaces,InvocationHandler handler)创建一个代理

D. 通过代理调用方法。

java动态代理:是在运行是生成的class对象,在生成时必须提供一组或一个interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当做这些interface中的任何一个来用,当然,这个DynamicProxy其实就是一个Proxy,他不会替你做实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。因此,DynamicProxy必须实现InvocationHandler接口。

5) 一个动态代理了和一个InvocationHandler 实现关联的。每一个动态代理实例的调用都要通过InvocationHandler接口的handler(调用处理器)来调用,动态代理不做任何执行操作,只是在创建动态代理时,把要实现的接口和handler关联,动态代理要帮助被代理执行的任务,要转交给handler来执行。其实就是调用invoke方法。

ava动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地制定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分配到委托对象上反射执行,配置执行过程中,开发人员还可以进行修改

代理设计模式

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息、过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

1.

为了保持行为的一致性,代理类和委托类通常会实现相同的接口

2.

引入代理能够控制对委托对象的直接访问,可以很好的隐藏和保护委托对象,也更加具有灵活性

相关的类和接口

要了解

Java

动态代理的机制,首先需要了解以下相关的类或接口:

1.

java.lang.reflect.Proxy:这是

Java

动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象

2.

java.lang.reflect.InvocationHandler:这是调用处理器接口,它自定义了一个invoke方法,用于几种处理在动态代理类对象上的方法调用。通常在该方法中实现对委托类的代理访问。

3.

java.lang.ClassLoader:Proxy

静态方法生成动态代理类同样需要通过类装载器来进行装载才能使用,它与普通类的唯一区别就是其字节码是由

JVM

在运行时动态生成的而非预存在于任何一个.class

文件中。

代理机制及其特点

首先让我们来了解一下如何使用

Java

动态代理。具体有如下四步骤:

1.

通过实现

InvocationHandler

接口创建自己的调用处理器;

2.

通过为

Proxy

类指定

ClassLoader

对象和一组

interface

来创建动态代理类;

3.

通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;

4.

通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。

JAVA的静态代理与动态代理比较

1.静态代理类:

由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。

由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等。

例程1 HelloService.java

package proxy;

import java.util.Date;

public interface HelloService{

public String echo(String msg);

public Date getTime();

}

2.动态代理类

与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。

Proxy类提供了创建动态代理类及其实例的静态方法。

(1)getProxyClass()静态方法负责创建动态代理类,它的完整定义如下:

public static Class? getProxyClass(ClassLoader loader, Class?[] interfaces) throws IllegalArgumentException

参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口。

(2)newProxyInstance()静态方法负责创建动态代理类的实例,它的完整定义如下:

public static Object newProxyInstance(ClassLoader loader, Class?[] interfaces, InvocationHandler handler) throws

IllegalArgumentException

参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口,参数handler 指定与动态代理类关联的 InvocationHandler 对象。

以下两种方式都创建了实现Foo接口的动态代理类的实例:

/**** 方式一 ****/

//创建InvocationHandler对象

InvocationHandler handler = new MyInvocationHandler(…);

//创建动态代理类

Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] { Foo.class });

//创建动态代理类的实例

Foo foo = (Foo) proxyClass.getConstructor(new Class[] { InvocationHandler.class }).

newInstance(new Object[] { handler });

/**** 方式二 ****/

//创建InvocationHandler对象

InvocationHandler handler = new MyInvocationHandler(…);

//直接创建动态代理类的实例

Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] { Foo.class }, handler);

由Proxy类的静态方法创建的动态代理类具有以下特点:

动态代理类是public、final和非抽象类型的;

动态代理类继承了java.lang.reflect.Proxy类;

动态代理类的名字以“$Proxy”开头;

动态代理类实现getProxyClass()和newProxyInstance()方法中参数interfaces指定的所有接口;

原创文章,作者:简单一点,如若转载,请注明出处:https://www.506064.com/n/126600.html

相关推荐

  • 深入解析replace函数SQL

    一、replace函数SQL用法 replace函数SQL是用来替换字符串中指定子串为另一个字符串的函数。其语法为: replace(string, from_str, to_st…

    编程 2024-10-14
  • 深入理解C++中友元类的使用

    一、友元类概述 在C++中,友元是一种机制,可以在类之间共享访问,允许类中的一个成员函数或一个类访问另一个类的私有或受保护成员。一般而言,友元是针对类而言的,它可以是一个函数,也可…

    编程 2024-11-30
  • 深入理解iframeframeborder

    一、什么是iframeframeborder Iframe是HTML中inline frame的缩写,表示嵌入一个html文档到另一个文档的内部框架。iframeframebord…

    编程 2024-12-03
  • 深入理解ApiPost压测的细节

    一、Apipost压测原理 Apipost压测是一种API测试工具,它可以模拟大量HTTP请求向系统发送请求以测试性能。操作原理通常与下面的步骤类似: 1. 模拟现实的负载生成器,…

    编程 2025-02-25
  • 深入了解el-popover组件

    一、基础使用 el-popover是element-ui中的一个组件,具有方便弹出提示的特性,使用它可以为页面增加更多的信息展示机制。 要使用el-popover组件,首先需要引入…

    编程 2024-11-30
  • 深入了解MapReduce工作流程

    一、MapReduce工作流程概述 MapReduce是用于分布式数据处理的编程模型。它采用了划分-映射-合并的思想,将大型数据集分成小块,由多个计算节点并行处理,并将小块结果合并…

    编程 2025-04-23
  • 深入了解sel4

    一、什么是sel4 1、Sel4是基于微内核的一个操作系统,它是一款高度安全性的系统,同时也具备高可靠性、高扩展性的特点。 2、sel4是来自于澳大利亚国立大学工程学院NICTA研…

    编程 2025-04-22
  • 深入理解Date类型

    一、Date类型简介 JavaScript中的Date类型用来处理日期时间相关的操作。Date类型是其中最基础的数据类型,可以表示从1970年1月1日00:00:00 UTC开始到…

    编程 2025-04-24
  • 深入剖析catgrep命令查找文件内容

    一、grep命令查找文件内容 grep命令可以用来查找文件中与指定正则表达式匹配的行,并打印这些行。可以使用-i参数忽略大小写,在使用时我们可以加上-r参数来查找指定目录下的所有文…

    编程 2024-10-14
  • 轻松部署静态网站——使用nginxlocal搭建本地环境

    静态网站的搭建是网站开发入门必备技能之一,而使用nginxlocal可以轻松地搭建本地环境,方便网站的测试与开发。下面从多个方面介绍如何使用nginxlocal搭建本地静态网站。 …

    编程 2024-12-17