Java反射

动态代理


java.lang.reflect.Proxy:提供了为对象产生代理的方法:

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
  • loader:指定用哪个类加载器,去加载生成的代理类。
  • interfaces:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法。
  • h:指定生成的代理对象要干什么事。

案例:明星业务被经纪人代理

工程结构

被代理对象的类

public class BigStar implements IStar{private String name;public BigStar(){}public BigStar(String name){this.name = name;}@Overridepublic String sing(String name) {return name + "正在唱歌";}@Overridepublic String dance() {System.out.println(name + "正在跳舞");return name + "正在跳舞";}
}

代理的接口

public interface IStar {String sing(String name);String dance();
}

代理方法

public class ProxyUtil {public static IStar createProxy(BigStar bigStar){IStar proxyInstance = (IStar) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{IStar.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("sing")){System.out.println("准备话筒");}else if (method.getName().equals("dance")){System.out.println("准备场地");}return method.invoke(bigStar, args);}});return proxyInstance;}
}

测试

public class demo {public static void main(String[] args) {BigStar bigStar = new BigStar("sherry");IStar proxy = ProxyUtil.createProxy(bigStar);String sing = proxy.sing("小明");System.out.println(sing);proxy.dance();}
}

控制台

获取class对象的方式

  • Class.forName("全类名")
  • 类名.class
  • 对象.getClass

获取构造方法

利用反射获取构造方法
Class类中用于获取构造方法的方法
Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组 
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>.. parameterTypes):返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>.. parameterTypes):返回单个构造方法对象Constructor类中用于创建对象的方法
TnewInstance(Object...initargs):根据指定的构造方法创建对象
setAccessible(boolean flag):设置为true,表示取消访问检查

获取成员变量

利用反射获取成员变量
Class类中用于获取成员变量的方法
Field[] getFields():返回所有公共成员变量对象的数组
Field[] getDeclaredFields():返回所有成员变量对象的数组
Field getField(String name):返回单个公共成员变量对象
Field getDeclaredField(String name):返回单个成员变量对象Field类中用于创建对象的方法
void set(Object obj, Object value):赋值
Object get(Object obj) 获取值。
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {Class<Student> aClass = Student.class;//1、获取公有的成员变量Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field);}//2、获取所有的成员变量Field[] declaredFields = aClass.getDeclaredFields();for (Field declaredField : declaredFields) {System.out.println(declaredField);}//3、获取单个成员变量Field sex = aClass.getField("sex");System.out.println(sex);Field name = aClass.getDeclaredField("name");System.out.println(name);//4、获取权限修饰符int modifiers = name.getModifiers();//4、获取成员变量名字String nameName = name.getName();//4、获取成员变量类型Class<?> type = name.getType();//5、获取成员变量对应的值Student student = new Student("女", "sherry", 18);name.setAccessible(true);Object value = name.get(student);System.out.println(value);//5、修改对象对应的值name.set(student, "张三");System.out.println(student);}

获取成员方法

利用反射获取成员方法Class类中用于获取成员方法的方法
Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
Method[]getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes):返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>.. parameterTypes):返回单个成员方法对象Method类中用于创建对象的方法
Object invoke(Object obj, Object... args):运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)
  Class<Student> aClass = Student.class;//1、获取本类中公有的方法(包含父类中的公共方法)Field[] fields = aClass.getFields();for (Field field : fields) {System.out.println(field);}//2、获取本类中所有的方法(不包含父类中方法)Method[] declaredMethods = aClass.getDeclaredMethods();for (Method declaredMethod : declaredMethods) {System.out.println(declaredMethod);}//3、获取指定方法Method eat = aClass.getMethod("eat", String.class);System.out.println(eat);//4、获取指定方法名String name = eat.getName();//5、获取指定方法的形参Parameter[] parameters = eat.getParameters();//6、获取指定方法的返回类型Class<?> returnType = eat.getReturnType();System.out.println(returnType);//7、获取指定方法的异常Class<?>[] exceptionTypes = eat.getExceptionTypes();Student student = new Student();eat.invoke(student, "汉堡包");

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

废弃物分类分割系统:入门训练营

废弃物分类分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DCNV2-Dynamic&#xff06;yolov8-seg-C2f-DWR等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Glob…

策划方案思路大公开,让你的创意更有市场!

各位营销界的脑洞大开者们&#xff0c;是不是又在为如何让你的创意在市场上大放异彩而绞尽脑汁&#xff1f; 别担心&#xff0c;今天我就来给你揭秘几个策划方案的新思路&#xff0c;让你的创意不仅有料&#xff0c;还有市场&#xff01; 一、紧跟热点&#xff0c;借势营销 …

软件著作权申请教程(超详细)(2024新版)软著申请

目录 一、注册账号与实名登记 二、材料准备 三、申请步骤 1.办理身份 2.软件申请信息 3.软件开发信息 4.软件功能与特点 5.填报完成 一、注册账号与实名登记 首先我们需要在官网里面注册一个账号&#xff0c;并且完成实名认证&#xff0c;一般是注册【个人】的身份。中…

L1G3000 提示工程(Prompt Engineering)

什么是Prompt(提示词)? Prompt是一种灵活、多样化的输入方式&#xff0c;可以用于指导大语言模型生成各种类型的内容。什么是提示工程? 提示工程是一种通过设计和调整输入(Prompts)来改善模型性能或控制其输出结果的技术。 六大基本原则: 指令要清晰提供参考内容复杂的任务拆…

【Windows】X-DOC:无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台

【Windows】X-DOC&#xff1a;无需NAS使用Windows也能安装Jellyfin玩私人影音媒体平台 1、前言2、Jellyfin服务搭建2.1 Jellyfin简介2.2 Jellyfin下载2.3 Jellyfin安装2.4 Jellyfin设置2.5 Jellyfin使用 3、终端访问3.1 浏览器访问 4、内网穿透 1、前言 下载收藏高清电影、电视…

基于C语言实现的图书管理系统

使用Visual Studio 2022编译工具进行编写代码的。 项目源码直接奉上: book1.h头文件: #ifndef __BOOK1_H //预处理用于条件编译 避免头文件反复包含 #define __BOOK1_H#include<stdio.h> #include <string.h> #include<stdlib.h> #include<stdbool.h&g…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

[C++] cpphttplib使用https而不是http

前言 首先我们假设是直接使用 httplib.h 的源文件。 支持 https 根据readme来看&#xff0c;需要开启一个宏&#xff0c;链接libssl和libcrypto就可以了。 下载openssl 保姆级OpenSSL下载及安装教程 选择非light的版本&#xff0c;这样才会有头文件和lib库引入文件。 编写C…

基于STM32的太阳跟踪系统设计

引言 本项目基于STM32微控制器设计了一个智能太阳跟踪系统&#xff0c;通过集成光敏传感器模块和电机控制系统&#xff0c;实现太阳能电池板的自动调节&#xff0c;以保持太阳能电池板始终垂直对准太阳&#xff0c;从而最大化光能的吸收效率。该系统通过实时监测太阳光的方向&…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

代码随想录-字符串-实现strStr()--KMP

题目描述 思路:典型的数据结构中的KMP算法实现 代码与解析 假设两个字符串长度分别为m和n&#xff0c;暴力解则为O(m*n) 引入KMP算法降低时间复杂度&#xff0c;求next数组是O(m) 遍历匹配串是O(n) KMP关键思路 ①求出模式串的next数组&#xff0c;即最长公共前后缀的长度…

unity3d————叉乘练习题

代码示例&#xff1a; public class text: MonoBehaviour {public Transform A;public Transform B;private float dotResult;private Vector3 crossResult;void Update(){dotResult Vector3.Dot(A.forward, B.position - A.position);crossResult Vector3.Cross(A.forward,…

【VSCode插件推荐】想准时下班,你需要codemoss的帮助,分享AI写代码的愉快体验,附详细安装教程

在快节奏的开发环境中&#xff0c;如何高效地完成工作、提高生产力&#xff0c;成为了每位开发者的追求。今天&#xff0c;我将为大家介绍一款强大的VSCode插件——CodeMoss&#xff0c;它不仅能帮助你提高编程效率&#xff0c;还能让你享受到AI写代码的乐趣。 AI 问答&#xf…

[复健计划][紫书]Chapter 7 暴力求解法

7.1 简单枚举 例7-1 Division uva725 输入正整数n&#xff0c;按从小到大的顺序输出所有形如abcde/fghij n的表达式&#xff0c;其中a&#xff5e;j恰好为数字0&#xff5e;9的一个排列&#xff08;可以有前导0&#xff09;&#xff0c;2≤n≤79。枚举fghij&#xff0c;验证a…

【大数据技术基础 | 实验七】HBase实验:部署HBase

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;验证Hadoop和ZooKeeper已启动&#xff08;二&#xff09;修改HBase配置文件&#xff08;三&#xff09;启动并验证HBase 六、实验结果七、实验心得 一、实验目的 掌握…

硬件知识10 线性稳压电源——二极管稳压、射级跟随器稳压、集成电路稳压

目录 一、相关理论 二、二极管稳压电路 1、理论与计算 2、不足 三、射级跟随器稳压电路 四、集成电路稳压器 1、78 79系列 2、LM317 LM337系列 3、功耗计算 一、相关理论 前文已进行了AC到DC的转换&#xff0c;只不过这个DC效果一般&#xff0c;因此需要用到稳压&…

查询引擎的演变之旅 | OceanBase原理解读

在关系型数据库中&#xff0c;查询调度器与计划执行器&#xff0c;有着与查询优化器同样重要的地位&#xff0c;随着计算机硬件技术的飞速进步&#xff0c;这两大模块的重要性日益凸显&#xff0c;成为提升数据库性能的关键所在。接下来&#xff0c;本文将由来自 OceanBase 的技…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC&#xff08;Microsoft Founda…

深度学习基础—循环神经网络的梯度消失与解决

引言 深度学习基础—循环神经网络&#xff08;RNN&#xff09;https://blog.csdn.net/sniper_fandc/article/details/143417972?fromshareblogdetail&sharetypeblogdetail&sharerId143417972&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link深…

并查集算法详解

文章目录 并查集概念并查集的常见操作构建并查集合并并查集和查找 关于find函数 并查集概念 并查集&#xff08;Union-Find&#xff09;是一种树型的数据结构&#xff0c;用于处理一些不交集的合并及查询问题。其主要应用是判断两个元素是否在同一个集合中&#xff0c;以及合并…