反射的应用之动态代理

Java反射06:反射的应用之动态代理 反射体现了代理模式的动态性 阅读详情

代码源自 尚硅谷 java基础 day19_10反射的应用之动态代理

package com.william.java.reflection.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//动态代理接口的使用, 体会反射是动态语言的关键
interface Subject {
	void action();
}

// 被代理类
class RealSubject implements Subject {
	@Override
	public void action() {
		System.out.println("我是被代理类,记得要执行我哦^=^");
	}
}

//
class MyInvocationHandler implements InvocationHandler {
	Object obj;// 实现了接口的被代理类的对象的声明

	// 1.给被代理的对象实例化
	// 2.返回一个代理类的对象
	public Object blind(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}

	// 当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下的 invoke 方法的调用
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object returnVal = method.invoke(obj, args);
		return returnVal;
	}

}

public class TestProxy {
	public static void main(String[] args) {
		// 1.被代理类的对象
		RealSubject realSubject = new RealSubject();
		// 2.创建一个实现了 InvocationHandler 接口的类的对象
		MyInvocationHandler handler = new MyInvocationHandler();
		// 3.调用 blind() 方法,动态的返回一个同样实现了 real 所在类实现的接口 Subject 的代理类的对象
		Object object = handler.blind(realSubject);
		Subject subject = (Subject) object;// 此时 sub 就是代理类的对象

		subject.action();// 转到对 InvacationHandler 接口的实现类的 invoke() 方法的调用

	}
}
通过以下代码加深 动态代理的理解
package com.william.java.reflection.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Person {
	void say();

	void eat();
}

interface Animal {
	void roar();

	void eat();
}

class TangWei implements Person {
	@Override
	public void say() {
		System.out.println("I'm TangWei, Hello");
	}

	@Override
	public void eat() {
		System.out.println("TangWei eat ice cream");
	}
}

class Angela implements Person {
	@Override
	public void say() {
		System.out.println("I'm Angela, Hello");
	}

	@Override
	public void eat() {
		System.out.println("Angela eat ice cream");
	}
}

class Cat implements Animal {
	@Override
	public void roar() {
		System.out.println("I'm a Cat, miao~");
	}

	@Override
	public void eat() {
		System.out.println("Cat eat mouse");
	}
}

class Dog implements Animal {
	@Override
	public void roar() {
		System.out.println("I'm a Dog, wang~");
	}

	@Override
	public void eat() {
		System.out.println("Dog eat bone");
	}
}

class MyInvHandler implements InvocationHandler {
	Object object;

	public Object blind(Object object) {
		this.object = object;
		return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {		
		return method.invoke(object, args);
	}

}

public class test {
	public static void main(String[] args) {
		TangWei tangWei = new TangWei();
		Angela angela = new Angela();
		Cat cat = new Cat();
		Dog dog = new Dog();

		MyInvHandler handler = new MyInvHandler();

		Person person = (Person) handler.blind(tangWei);
		person.say();
		person.eat();

		person = (Person) handler.blind(angela);
		person.say();
		person.eat();

		Animal animal = (Animal) handler.blind(cat);
		animal.eat();
		animal.roar();

		animal = (Animal) handler.blind(dog);
		animal.eat();
		animal.roar();

	}

}

Java反射机制与动态代理深入剖析与应用 Java反射机制是Java语言在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。这一机制增加了程序的灵活性,但也增加了程序的复杂性和安全风险。代理模式是一种结构型设计模式,它允许通过一个代理对象来控制对另一个对象的访问。代理模式的关键在于,它为对象提供了额外的、间接的访问层,从而在不改变原始对象的条件下,为对象操作提供额外的行为或操作。 阅读详情

相关推荐

macOS Jdk1.8安装(目前主流版本的jdk)

添加环境环境变量,类似于windows的高级设置中path配置的环境变量。查看 JAVA_HOME 目录。查看 JDK 版本信息。一直下一步安装就好了。在终端的根目录下运行。

m0_50207524的博客 9353

反射的应用:动态代理

1、代理设计模式的原理 使用一个代理将对象包装起来,然后用该代理替代原始对象,任何对对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上。 2、静态代理示例 /** * @auther hu * @create 2019/8/18 * <p> * 静态代理示例 * 代理类和被代理类在编译期间,就确定下来了 */ interface ClotheFacto...

明天请叫我早点起床的博客 261

【抖音滑动验证码风控分析】

文章摘要:通过对比正常响应与验证码风控响应的头部信息,发现两者存在显著差异。正常响应返回JSON格式数据(Content-Type: application/json)并采用分块传输(Transfer-Encoding: chunked),而风控响应仅返回空文本(Content-Type: text/plain,Content-Length: 0),并通过X-Vc-Bdturing-Parameters等特殊头字段传递风控信息。这些差异主要体现在内容类型、数据传输方式和风控标识参数上,为风控识别提供了关键特

qq_44990881的博客 1102

java中的动态代理和反射 反向代理

java的动态代理是用反射实现的。 InvocationHandler 动态代理 反射 Proxy java.lang.reflect

fxnfk 1万+

MITRE ATT&CK超详细学习笔记-01(背景,术语,案例)

MITRE是一个向美国政府提供系统工程、研究开发和信息技术支持的非营利性组织,于1958年从麻省理工学院林肯实验室分离出来后参与了许多最高机密的政府项目,开展了大量的网络安全实践。例如,MITRE公司在1999年发起了常见披露漏洞项目(CVE,CommonVulnera-bilitiesandExposures)并维护至今。其后,MITRE公司还维护了常见缺陷列表(CWE,CommonWeaknessEnumeration)这个安全漏洞词典。.........

Zichel77的博客 1万+

单细胞转录组分析(scRNA-seq)

单细胞转录组测序(Single-cell RNA sequencing,scRNA-seq)是一种高通量测序技术,可以在单细胞水平解析基因表达情况,揭示细胞异质性,探索稀有细胞类型,并研究细胞状态转换及动态调控机制。与传统的。

大甘的博客 6149

反射机制的应用之动态代理

代理设计模式的原理: 使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。最好可以通过一个代理类完成全部的代理功能。 静态代理: //静态代理:代理类和被代理类在编译时就已确定 interface ClothFactory{ void produceCloth(); } //代理类 clas...

weixin_44022886的博客 190

保姆级教程:手把手教你从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件(附网址规律总结)

本文提供从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件的详细教程,包括路径解析、版本号确定和下载命令示例。特别解析了GRCh37的特殊存储结构,并分享批量下载、文件校验等高级技巧,帮助生物信息学研究者高效获取基因组注释文件。

weixin_29289821的博客 204

反射_应用:Java动态代理

动态代理特别重要,Java的框架都爱这玩意儿!!!Java动态代理动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。动态代理使用场合:1)调式2)远程方法调用代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。动态代理之前先说一个静态代理的...

一颗洛米 239

Trae 在代码审查场景的 3 大差异化能力:对比 Claude Code、Cursor 与 Codex 实测

揭示代码审查的核心矛盾是上下文断层而非找 Bug,介绍 Trae 通过跨文件符号追踪、意图-实现对齐校验、增量变更影响图谱生成三件事实现上下文校准,并对比其与 Claude Code、Cursor、Codex 在多模块 Java 项目中的实际审查差异

weixin_42525482的博客 152

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 202

Java 反射与动态代理:实践中的应用与陷阱

在现代Java应用中,反射和动态代理提供了强大的灵活性,但它们也带来了性能和复杂度上的挑战。本文将深入探讨这些技术在实际项目中的应用,分析它们可能导致的陷阱,并提供详细的优化策略,尤其在大型系统或基于Spring的项目中,如何避免性能瓶颈和滥用。

qq_36534560的博客 3373

华为od 面试八股文_操作系统_01_含答案

华为od 面试八股文_操作系统_01_含答案

MISAYAONE的博客 3275

【附章6 反射的应用】反射的应用:动态代理

【附章6 反射的应用:动态代理、概述,其相关API、动态代理原理、步骤、AOP的讲解】

小鳴人的博客 1480

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java反射机制与动态代理解析与应用

在调用方法时,实际对象的相应方法会被代理处理器的invoke()方法拦截,并在方法前后添加一些额外的操作。通过代理对象,我们可以在调用实际对象的方法前后进行一些额外的操作。通过反射机制,我们可以获取类的构造方法、字段、方法等信息,并可以在运行时动态创建对象、调用方法以及访问和修改字段的值。Java中的每个类都有一个Class对象,它包含了该类的完整信息,可以通过该对象来获取类的构造方法、字段、方法等信息。通过反射机制,我们可以获取类的所有字段和方法,并根据一定的规则来控制对字段和方法的访问权限。

小筱在线博客 841

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Java 反射应用 之 动态代理】

静态代理是可以解决增强的问题,也可以实现代理类帮助被代理类做一些额外的事情。但是这里有一个问题,不知道你发现没有,如果采用静态代理的话,每个静态类都要自己写,这样是不是非常繁琐。有没有更好的方式,有---->那就是动态代理。

Snow的博客 1233

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

彻底理解Java反射以及动态代理中对反射的应用

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。 反射有什么用,其实最主要的用处就两个: 根据类名在运行时创建实例(类名可以

leeta的博客 301

【Java反射】反射的应用:动态代理

文章目录1 代理设计模式的原理2 复习:静态代理3 实现:动态代理参考资料 1 代理设计模式的原理 使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 之前的代理机制,属于静态代理,特征是代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。最好可以通过一个代理类完成全部的代理功能。 代理类和被代理类都需要实现同一个接口。

Awt_FuDongLai的博客 240

反射的应用——动态代理

weixin_34211761的博客 90

java反射应用之动态代理

之前看了java反射 看得很慢 就是感觉看不走那种  后面通过慢慢观看视频 手写代码 对java反射有了一定的了解 java反射之动态代理 首先理解一下静态代理 什么是静态代理 就是运用接口然后新建一个代理类通过代理类实例化被代理类对象来调用被代理类方法 其次静态代理的缺点 代理类和被代理类在编译期间已经确定不易于程序的扩展 下面一个made nike factory 来帮助理解什么是静态代

星空中的一颗星 363

php反射应用场景_PHP 反射之动态代理

反射可以探知类的内部结构 可以用它做hook实现插件功能,或者做动态代理与反射相关类和对象相关的函数get_object_varsget_class_methodsget_class_varsget_classget_parent_classmethod_existsproperty_existstrait_exists反射相关的 API 类reflectiontypereflectionpro...

weixin_39624097的博客 177

07_反射的应用:动态代理

动态代理静态代理:动态代理:动态代理步骤:动态代理与AOP (Aspect Orient Programming) 代理理 设计模式的原理:   使用一个代理将对象包装起来, 然后用该代理对象取代原始象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。 动态代理相比于静态代理的优点:   抽象角色中(接口)声明的所有方法都被转移到调用处理器一个集中的方法中处理,这样,我们可以更加灵活和统一的处理众多的方法。(看完下面就能理解) 静态代理:   创建一个接口,然后创建被

qq1075666462的博客 137

探索反射API与AOP在动态代理中的应用

反射(Reflection)和面向切面编程(Aspect-Oriented Programming, AOP)是Java中两个强大的特性,它们经常被用于动态代理的实现。动态代理允许我们在运行时动态地创建实现了一组接口的类的实例,并可以在这些实例的方法调用前后插入额外的代码,即切面(Aspect)。包提供了反射API,而AOP则通常通过诸如AspectJ、Spring AOP等框架来实现。不过,Java自身也提供了一种基于接口的动态代理机制,即。

api77的博客 1028
上一篇: Java进阶之reflection(反射机制)——反射概念与基础
下一篇: 设计模式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值