Java 代理机制

ESP32-CAM图像糊成马赛克?OV2640参数调优保姆级教程(亮度/对比度/饱和度) 本文提供了一份详细的ESP32-CAM图像调优教程,针对OV2640摄像头常见的图像模糊问题,从分辨率设置、亮度/对比度/饱和度调整到高级寄存器配置,帮助用户优化网页显示画质。通过代码示例和实用技巧,解决马赛克、色彩暗淡等问题,提升摄像头性能。 阅读详情

本文纯属搬运,参考以下文章(侵删,请联系):
Java代理机制与hook:
http://www.zengye.cc/2016/05/01/java%E4%BB%A3%E7%90%86%E6%9C%BA%E5%88%B6%E4%B8%8Ehook/
Java三种代理模式:静态代理、动态代理和cglib代理:
https://segmentfault.com/a/1190000011291179

代理模式

代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
简言之,代理模式就是设置一个中间代理来控制访问原目标对象,以达到增强原对象的功能和简化访问方式。

举个例子:我们生活中经常到火车站去买车票,但是人一多的话,就会非常拥挤,于是就有了代售点,我们能从代售点买车票了。这其中就是代理模式的体现,代售点代理了火车站对象,提供购买车票的方法。


静态代理

静态代理非常简单
这里写图片描述
就是创建一个代理类,与真实类继承自同一接口,代理类持有真实类的引用,在外部调用代理类,代理类可以在调用真实类的前后加上自己的逻辑。其中接口类可以省略,代理类直接继承自真实类。

// 抽象角色:
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  Subject realSubject;

  public  ProxySubject(Subject realSubject)  {this.realSubject = realSubject }

  // 该方法封装了真实对象的request方法
  public void  request()  {
     preRequest();
     realSubject.request();  // 此处执行真实对象的request方法
     postRequest();
  }
  ...
}

// 客户端调用:
RealSubject real = new RealSubject();
Subject sub = new  ProxySubject(real);
Sub.request();

或者接口实现

//抽象类
public interface Subject {
    public void request();
}

//真实角色:实现了的request()方法
public class RealSubject implements Subject{
    @Override
    public void request()  {
     System.out.println( " From real subject. " );
    }
}

//静态代理对象
public class ProxySubject implements Subject{
    //以真实角色作为代理角色的属性
    private  Subject realSubject;

  public  ProxySubject(Subject realSubject)  {this.realSubject = realSubject }

  // 该方法封装了真实对象的request方法
  public void  request()  {
     preRequest();
     realSubject.request();  // 此处执行真实对象的request方法
     postRequest();
  }
  ...
}

// 客户端调用:
RealSubject real = new RealSubject();
Subject sub = new  ProxySubject(real);
Sub.request();

静态代理的缺点:
1. 冗余。由于代理对象要实现与目标对象一致的接口/抽象类,会产生过多的代理类。
2. 不易维护。如果真实类中有多个方法需要代理,每个方法都要去实现,一旦接口增加方法,目标对象与代理对象都要进行修改。


基于JDK反射的动态代理

动态代理利用了JDK API,动态地在内存中构建代理对象,从而实现对目标对象的代理功能。动态代理又被称为JDK代理或接口代理。

基于JDK的动态代理原理:主要是利用了Java的反射机制。

静态代理与动态代理的区别主要在:

  • 静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
  • 动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
public  interface Subject {
  abstract  public  void request();
}

// 具体角色RealSubject:
public  class RealSubject implements Subject {
  public RealSubject() {}
  public  void request() {
    System.out.println( " From real subject. " );
 }
}

// 基于反射的代理处理器:
import java.lang.reflect.Method;
import java.lang.reflect.InvocationHandler;

public  class Handler implements InvocationHandler {
  private Object sub;
  public Handler(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 ;
  }
}
//调用
RealSubject rs = new RealSubject(); // 在这里指定被代理类
InvocationHandler hander = new Handler(rs);
Class cls = rs.getClass();
Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), hander);
subject.request();

可以通过 Proxy.newProxyInstance() 方法来动态的创建一个代理。这个方法有3个参数:

ClassLoader loader :负责加载动态代理类,将字节码文件加载进虚拟机并生成相应的class,
这里得到的loader是其子类AppClassLoader(负责加载应用层字节码)的一个实例

Class<?>[] interfaces : 接口数组

InvocationHandler h :InvocationHandler接口的实例,把方法调用转到代理上

所有对 proxy 的调用都被转向到实现了 InvocationHandler 接口的 handler 上。

invoke()方法中的 proxy 参数是实现要代理接口的动态代理对象。通常你是不需要他的。
invoke()方法中的 Method 对象参数代表了被动态代理的接口中要调用的方法,从这个method对象中你可以获取到这个方法名字,方法的参数,参数类型等等信息。
invoke()方法中的 Object[]数组参数包含了被动态代理的方法需要的方法参数。注意:原生数据类型(如int,long等等)方法参数传入等价的包装对象(如Integer, Long等等)。

动态代理特点:
1. 动态代理对象不需要实现接口,但是要求目标对象必须实现接口,否则不能使用动态代理。
2. 动态代理是使用反射去调用真实类,处理代理的逻辑都在 InvocationHandler 实现类的 invoke 方法中,比静态代理好维护。但是JDK的动态代理机制必须基于接口,Proxy.newProxyInstance 方法必须传入一个接口,在非接口实现类中,只能使用静态代理,或使用第三方方案,例如CGLIB库。


CGLIB动态代理

CGLIB(Code Generation Library) 是一个基于 ASM 的字节码生成库,它允许在运行时对字节码进行修改和动态生成,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。CGLIB 通过 继承方式 实现代理。

ASM 是一个JAVA字节码分析、创建和修改的开源应用框架,可以参考
http://victorzhzh.iteye.com/category/140253

cglib与反射动态代理的区别是

  • 使用动态代理的对象必须实现一个或多个接口
  • 使用cglib代理的对象则无需实现接口,达到代理类无侵入。
  • cglib代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但cglib会继承目标对象,需要重写方法,所以目标对象不能为final类。
//真实类
public class Subject{
    public void request() {
        System.out.println( " From real subject. " );
    }
}

// CGLIB动态代理
// 1. 首先实现一个 MethodInterceptor,方法调用会被转发到该类的 intercept()方法。
public class ProxyFactory implements MethodInterceptor{
  ...
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        //before do something
        return proxy.invokeSuper(obj, args);
        //after do something
    }
}
// 2. 然后在需要使用真实类的时候,通过CGLIB动态代理获取代理对象。

//例子
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class ProxyFactory implements MethodInterceptor{

    private Object target;//维护一个目标对象
    public ProxyFactory(Object target) {
        this.target = target;
    }

    //为目标对象生成代理对象
    public Object getProxyInstance() {
        //工具类
        Enhancer en = new Enhancer();
        //设置父类
        en.setSuperclass(target.getClass());
        //设置回调函数
        en.setCallback(this);
        //创建子类对象代理
        return en.create();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开启事务");
        // 执行目标对象的方法
        Object returnValue = method.invoke(target, args);
        System.out.println("关闭事务");
        return null;
    }
}

//目标对象
Subject target = new Subject();
//代理对象
Subject proxy = (Subject) new ProxyFactory(target).getProxyInstance();
//执行代理对象方法
proxy.request();
IC/FPGA笔试/面试题分析(七)建立时间和保持时间类型考题汇总分析 自从召集2020届校招同行加入新建立的“IC/FPGA校招笔试面试交流群“,见识到了很多关于建立时间和保持时间分析的题目,在为别人解答疑惑,以及别人为自己解答疑惑的同时,自己对于知识的理解更加深刻了。 对于建立时间而言,从单独的对触发器的建立时间和保持时间的分析到了对电路(系统)的建立时间到保持时间的分析,前者是核心,后者是扩展,后者建立在前者的基础之上进行推到得到,同时也是芯片内部实际遵循的时... 阅读详情

相关推荐

OV5640摄像头DVP与MIPI接口配置实战:从30Hz到60Hz的性能优化指南

本文详细解析了OV5640摄像头在DVP与MIPI接口下的60Hz性能优化方法,重点解决720p分辨率下帧率仅30Hz的常见问题。通过精确配置时钟树、传感器寄存器和接口参数,提供DVP与MIPI接口的实战配置代码,并分享调试工具与性能验证技巧,帮助开发者实现稳定的60fps输出。

weixin_29223603的博客 1301

Java-代理模式

1. 代理模式的原理 使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理对象去调用。代理对象决定是否以及何时将方法调用转到原始对象上。 2. 静态代理模式 这里通过一个衣服工厂的例子来说明静态代理模式: 代理类和被代理类需要共同实现一个接口(规范),接口中包含核心功能。代理类中需要有一个与接口相同类型的私有成员,被代理类只需要完成所有的核心功能,而代理类的核心功能在实现时可以增加其他辅助核心功能的方法,真正核心功能的执行还是调用被代理类的核心功能。 package c

郭松源的博客 383

计算机考研常见面试题

写在前面 本人参加20考研,由于复试没有具体要求会问哪几门课,所以我就找了网上一些常见的计算机专业的面试题,整理如下 主要结构: 数据库 软件工程 操作系统 计算机组成原理 计算机网络 数据结构 C++ Java 数据库 1、数据:数据库中存储的基本对象。 数据库:长期存储在计算机内的、有组织的、可共享的数据集合。 数据库管理系统:专门用于建立和管理数据库的一套软件。对外部程序提供访问数据库的方法,对内进行数据管理。 数据库系统:与和数据库相关的整个系统,一般由数据库、数据库管理系统、应用程序、数

qq_38841618的博客 2万+

java获取动态代理的target目标

java获取动态代理的target目标

lanbbz的专栏 2427

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 540

为什么devc++编译项目会失败?提示gcc无法正常启动...

根据你的描述,编译能正常进行时,只打开源文件并没有问题,问题主要出现在创建项目后编译失败,这通常与 Makefile 配置、环境变量、编译器路径设置等因素有关。你可以检查 Makefile 配置,验证 DevC++ 的编译器环境设置,或者尝试清理并重新配置项目。如果问题仍然存在,可以尝试重装 DevC++ 或重新配置工具链。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1376

搞懂Java代理和反射一篇就够了

搞懂Java代理和反射

我是老伯的博客 4293

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分

/在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入0,并在k=0时运算。三、程序清单(每条语句必须包括注释或在开发窗口注释后截图)四、综合、管脚分配、生成输出文件、下载(所有步骤截图)五、仿真程序清单、波形(波形截图必做,截图!.k(k),//开关。

Welcome To My6n Blog 4333

java基础 代理

本文主要讲述了java基础中代理的相关知识。

m0_75209145的博客 2628

springboot+vue项目基础开发(12)vue项目的搭建

在src目录下新建 api,utils,views文件夹。删除componets目录下自动生成的所有文件。在utils文件夹下创建request.js。启动项目,记得是要在管理员下启动。

m0_58498702的博客 154

提示词工程中的上下文隔离

已经进入context的prompt是没有办法让大模型真正的忘记的,但是可以通过prompt技巧强约束模型的后续推理中“不再使用、不再提及、不再引用”某部分提示词,这其实是一种行为抑制(behavior suppression),并不是删除。

Criss@陈磊 235

Java代理模式的实现详解

本文章是在学习mybatis框架源码的过程中,发现对于动态代理Mapper接口这一块的代理实现还是有些遗忘和陌生,因此在本文章中就Java实现代理模式的过程进行一个学习和总结。代理模式(Proxy Pattern)定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。代理模式的英文叫做Proxy或Surrogate,它是一种对象结构型模式。

Bananaaay的博客 2261

华为od 面试八股文_C++_01_含答案

华为od 面试八股文_C++_01_含答案

MISAYAONE的博客 5601

Java中的代理机制

代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。

qq_52331401的博客 1194

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java代理机制

java代理机制 java代理机制分为静态代理和动态代理 并未发现静态代理和动态代理的具体区别,更倾向于动态代理,可以自主灵活配置接口类,可能是在代码运行速度或某些性能方面要快一点(此处没有过多地去了解)。 本人对代理机制的理解简单的一句话就是在调取接口的时候,除了执行接口内的逻辑外还要执行想要执行的代码,就可以用代理机制。不多说直接上代码 1:需要建一个代理类,并在其中加入想要在调用目标接口时想...

weixin_43690810的博客 568

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

关于JAVA代理机制的理解和实现

关于JAVA代理机制的理解和实现 代理机制 java常用的设计模式就有代理模式,代理机制是通过代理类和委托类实现相同的接口来完成代理过程,在这其中代理类主要是负责预处理、转发消息给委托类,以及处理消息等功能。代理类和委托类之间实现间接关联的关系,代理类不是真正的实现委托类的功能,只是作为一个桥梁的作用,通过代理类来间接实现委托类的功能,并且在这期间代理类可以添加更多的功能。 静态代理 静态代理是直接将代理的具体类、实现方法表现在代码里,在编译时就已经将接口,被代理类,代理类等确定下来。在程序运行之前,代理类

qq_41123811的博客 228

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java的代理机制

在看Spring的AOP时怎么都看不懂,所以先花了两天时间看了Java的代理机制,这里的是记下的笔记。

iteye_6979的博客 129

Java高级基础-两种代理机制的实现

对于Sbring框架中的一些部分,类似于AOP、RMI均存在使用代理机制执行方法的思想,代理机制实质上是通过反射机制得到另一个类的方法以及对象,不需要通过使用方法所在类的对象来调用此,且对于之前只能执行然后返回结果的方法进行处理,使得我们可以在方法执行前后进行相关操作,类似于取出或改变参数、得到结果以及修改结果。

wexin_mylove的博客 587

浅谈Java代理机制

Java代理就是。。。。

changioux的专栏 612

使用Java的代理机制进行日志输出

在测试《Spring从入门到精通》使用Java的代理机制进行日志输出 这段代码时我的并没有输出日志信息,找了好多博客都没有解决,记录一下 package proxy; import org.apache.log4j.Level; import org.apache.log4j.Logger; import java.lang.reflect.InvocationHandler;

sinat_35229420的博客 452

JAVA代理机制

EJB的拦截用的就是JAVA的代理机制。说广一点,EJB的实现就是利用代理实现的远程方法调用。EJB会在服务器端生成一个实现了所有的接口的类的代理,然后在里面监听你所做的所有事情,并与之反应,这样就实现了远程调用的效果,你在这边调用,而EJB容器在别的地方也可以知道你调用了什么,并返回与之对应的结果,这一切都是用代理来实现的。 下面我们就来认识一下,代理的主要类:java.l

豌豆的专栏 539

java 代理机制

java代理机制,从使用者的角度,可以实现针对接口进行调用。代理将针对接口的调用,传递给构造代理对象时传入的调用处理器InvocationHandler。 下面举个例子。 1,首先定义一个接口类。   package com.bestree.learn; /** * 接口类。 * @author bestree007 * */ public interface He

bestree007的专栏 536

Java代理机制解读,这些你都了解吗?

Java代理机制大全,这些你都了解吗?常规编码设计代理模式概述静态代理代码示例Java 字节码生成框架什么是动态代理JDK 动态代理机制使用步骤代码示例CGLIB 动态代理机制使用步骤代码示例JDK 动态代理和 CGLIB 动态代理对比什么情况下使用动态代理静态代理和动态代理对比 常规编码设计 通常面向对象的设计思路是所有 interface 类型的变量总是通过向上转型并指向某个实例的。 (1)首先,定义一个接口: public interface SmsService { String send

香农三定律的博客 523

实例分析Java的代理机制

(0)准备工作 本文使用log4j日志工具实现日志输出,添加log4j的步骤如下: (1)下载地址:http://logging.apache.org/log4j/1.2/download.html,下载 【log4j-1.2.17.zip】 (2)将【log4j-1.2.17.jar】 文件,复制到 lib 下 (3)然后右击添加到资源文件。 (一)通用的日志输出方法 通用...

肥羊汤 242
上一篇: Leetcode 回溯法 (持续更新)
下一篇: (搬运 )Java抽象类与接口的区别
Yonghua Li
博客等级 码龄10年 38粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值