反射的使用

2023-11-07

反射

一.反射基本概念—————————————————————————


1.反射是什么?


2.Class类实例对象是什么?,Field类实例对象和Method类实例对象是什么?

1.在类加载阶段,JVM将所有类的.class文件读到内存中,并为之创建一个java.lang.Class对象。而在一个程序中的每一个类仅有一个java.lang.Class对象
每一个属性可以有多个Field类实例对象;
每一个Method可以有多个Method实例对象。
2.在如下代码块中:返回的结果是true,且都是class com.junjun.pojo.User,这说明引用类型变量c1和c2所指向的内存地址是一样的!而Field和Method则不是

        Class c1=com.junjun.pojo.User.class;
		Class c2=com.junjun.pojo.User.class;
		Field field1=c1.getField("junjun");
		Field field2=c1.getField("junjun");
		Method method1=c1.getMethod("getName");
		Method method2=c2.getMethod("getName");
		System.out.println(field1);//public java.lang.String com.junjun.pojo.User.junjun
		System.out.println(field2);//public java.lang.String com.junjun.pojo.User.getName()
		System.out.println(c1==c2);//true
		System.out.println(field2==field1);//false
		System.out.println(method1==method2);//false
		System.out.println(field1.equals(field2));//true
		System.out.println(method1.equals(method2));//true

3.jVM类加载机制(很难又很重要,待补充)

简而言之。类加载器就是class字节码文件的搬运工,将它从硬盘搬运到JVM虚拟机中


二.反射的作用——————————————————————————

三.Class详解(Class的使用场景)————————————————

!!!注意:
1.反射过程中会自动调用目标对象的无参构造方法, 因此在目标类的定义中一定要写无参构造,否则可能反射失败
2.为了好区分,我把Class c1,Class c2叫做Class类引用变量。把c1对应的具体类叫做目标类型引用变量。


1.通过对象获取Class类型引用变量(com.junjun.pojo.Hello的内存空间并不是我们用new来创建出来的,而是JVM类加载阶段创建出来的。我们只是创建一个Class类型的引用变量)

1.Class c1=hello.getClass();//通过“目标对象”创建对应的“Class类型的引用变量”
2.Class c2=com.junjun.pojo.Hello.class;//通过类名创建对应的“Class类型的引用变量”
3.Class c3=Class.forName(“com.junjun.pojo.Hello”);//通过类名的字符串来创建“Class类型的引用变量”


2.通过Class类型引用变量访问字段(属性)Field

1.public Field getField(String name) (包括所继承父类中的属性)
获取public属性且属性名为name的的Field类引用变量
(返回结果为public java.lang.String com.junjun.pojo.User.junjun)

2.Field[] getFields()(包括所继承父类中的属性)获取所有public的属性
3.Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
4.Field[] getDeclaredFields():获取当前类的所有field(不包括父类)


2.通过Class类型引用变量访问方法Method

Method getMethod(name, Class…):获取某个public的Method(包括父类)
Method getDeclaredMethod(name, Class…):获取当前类的某个Method(不包括父类)
Method[] getMethods():获取所有public的Method(包括父类)
Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)


3.访问构造方法

getConstructor(Class…):获取某个public的Constructor;
getDeclaredConstructor(Class…):获取某个Constructor;
getConstructors():获取所有public的Constructor;
getDeclaredConstructors():获取所有Constructor。


4.获取继承关系

Class getSuperclass():获取父类类型
Class[] getInterfaces():获取当前类实现的所有接口。


5.动态代理

public class Main {
  public static void main(String[] args) {
      InvocationHandler handler = new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              System.out.println(method);
              if (method.getName().equals("morning")) {
                  System.out.println("Good morning, " + args[0]);
              }
              return null;
          }
      };
      Hello hello = (Hello) Proxy.newProxyInstance(
          Hello.class.getClassLoader(), // 传入ClassLoader
          new Class[] { Hello.class }, // 传入要实现的接口
          handler); // 传入处理调用方法的InvocationHandler
      hello.morning("Bob");
  }
}
interface Hello {
  void morning(String name);
}

四. Java.lang.reflect包中含有大量与反射相关的类

1.AccessibleObject
2.Array
3.Constructor
4.Field
5.Method
6.Modifier
7.Proxy
8.ReslectPermission


1.AccessibleObject

它是Constructor, Field, Method 的直接父类


2.AccessibleObject

它是Constructor, Field, Method 的直接父类


3.Constructor

不常用


4.Field

不常用


5.Method

1、 Class<?> getDeclaringClass() :返回Method的Class实例对象,如:class com.junjun.pojo.User
2、 Type[] getGenericParameterTypes() :返回形参的数组,每个Type如:class java.lang.String
3、Type getGenericReturnType() :返回返回值类型的数组,每个Type如:class java.lang.String
4、 String getName() :以 String 形式返回此 Method 对象表示的方法名称。
5、Object invoke(Object obj, Object… args) :调用obj的method方法,传入参数是args。

注意:Object… args是指在传入多个参数时,要用逗号分开按顺序来依次传入参数,如下:

Method method1=com.junjun.pojo.User.class.getMethod("setName",String.class,int.class);
method1.invoke(user,"22",1);

6.Proxy

1、static InvocationHandler getInvocationHandler(Object proxy) :返回指定代理实例的调用处理程序。
2、 static Class<?> getProxyClass(ClassLoader loader, Class<?>… interfaces):返回代理类的 java.lang.Class 对象,并向其提供类加载器和接口数组。
3、static boolean isProxyClass(Class<?> cl) :判断是否是代理对象
4、static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
创建一个动态代理对象


5.动态代理详解

…待完成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反射的使用 的相关文章

  • assert注意事项

    结论 直接使用 assert field null 可以快速的check属性 但是该方法会在使用反射的时候多一个属性 assertionsDisabled 分析 public class Assert static final boolea
  • Java之Class.forName方法详解

    一 前言 二 案例 三 详解 一 前言 在说明Class类的静态方法forName 之前 先清楚有关Class类的几个概念 1 Class类封装了类或接口的运行时状态 Java程序在运行时 Java运行时系统一直对所有的对象进行所谓的运行时
  • 青春有你-Java基础篇(2.5)

    Java基础篇 2 5 2 Java基础知识 泛型 泛型与继承 类型擦除 泛型中 KTVE object 等的含义 泛型各种用法 List lt Object gt List
  • C#编程,反射获取命名空间、类名、方法名

    原文 https www cnblogs com xdot p 8651506 html 1 利用反射动态加载dll using System Reflection Assembly asm Assembly LoadFrom AppDom
  • 反射 动态代理 线程池

    反射 动态代理 线程池 反射 动态获取类的字节码文件 并对其进行抽象 通过反射可以获取一个类的全部方法和属性 然后进行调用 反射与类之间抽象的理解 Class 将字节码对象进行抽象 出现了 1 属性 表示字节码文件的属性的属性 privat
  • java注解与反射的基本使用(这一篇就够了!)

    一 注解 Annotation 1 什么是注解 相信大家对注解应该并不陌生 在现在信息飞速发展的年代 各种优秀的框架或许都离不开注解的使用 像我们在实现接口一个方法时 也会有 Override注解 注解说白了就是对程序做出解释 与我们在方法
  • java反射机制

    1 类加载机制 启动JVM 加载字节码 当调用java命令来运行某个java程序时 该命令将会启动一个JVM进程 同一个JVM中的所有程 变量都处于同一个进程中 共享该JVM的内存区域 当出现以下情况时 JVM会退出 1 程序正常执行结束
  • Java反射获取私有(private)对象属性,方法(子类,父类,祖先....)(如何改变string的值)

    Java反射 获取对象私有属性 方法 String是否可变 先来看一个例子 String可变还是不可变 大家都应该知道 或者听过 String类是不可变的 为什么呢 因为String其实使用一个 private final char val
  • 深入理解Java中的反射机制和使用原理!详细解析invoke方法的执行和使用

    反射的概念 反射 Refelection 反射是Java的特征之一 允许运行中的Java程序获取自身信息 并可以操作类或者对象的内部属性 通过反射 可以在运行时获得程序或者程序中的每一个类型的成员活成成员的信息 程序中的对象一般都是在编译时
  • 通过反射获取一个对象的属性值三种方法比较

    这里写目录标题 为何要写这篇博客 数据准备 方法实践 总结 为何要写这篇博客 反射机制的用途非常多 比如获取方法 属性名和属性值等 甚至可以获取标签等标签属性 今天来比较几种获取实例化对象的属性值方法 数据准备 Builder FieldD
  • 动态代理简单实现

    动态代理简单实现 文章目录 动态代理简单实现 一 反射 二 反射机制提供的功能 1 相关API 2 Class类的理解 4 创建类的对象的方式 5 Class实例可以是那些结构的说明 三 类的加载过程 四 动态代理 反射的动态性 一 反射的
  • List多字段升降序排序

    工具类 Component public class SortListUtil
  • 反射与注解(详细)

    文章目录 一 注解Annotation 1 什么是注解 2 内置注解 3 元注解 4 自定义注解 二 反射机制 1 静态vs动态语言 动态语言 静态语言 2 java反射机制概述 3 java反射机制研究及应用 反射机制提供的功能 优点 缺
  • Java反射获取SuperClass中的字段

    包 org springframework util ReflectionUtils ReflectionUtils findField clazz fieldName public class ReflectionTest public
  • 使用反射对单例模式进行攻击的讨论

    我们都知道在单例模式中 对构造函数进行私有化private修饰 保证了类不能使用new进行对象的实例化 但是如果使用反射获取构造函数 在进行实例化就会导致private失效 作者用中文作为类名 请读者勿怪 纯属喜好 工作中是不允许的哦 ja
  • JAVASE 注解与反射

    注解与反射都是框架的基础 注解 注解的格式 注释名 参数名 参数值 可以使用在 package class method field上 作为辅助信息 内置注解 Override 重写方法 会检测方法名称 Deprecated 表明该方法已过
  • Java的反射技术(Class类,Constructor类,Method类, Field类)

    Java编码时知道类和对象的具体信息 此时直接对类和对象进行操作即可 无需反射 如果编码时不知道类或者对象的具体信息 此时应该使用反射来实现 为什么要使用反射 反射就是把Java类中的各种成分映射成一个个的java对象 例如 一个类有 成员
  • java的反射机制Class.forName()

    Class forName 方法的作用 就是初始化给定的类 1 Class 类概念 Class 也是一个 Java 类 保存的是与之对应 Java 类的 meta信息 元信息 用来描述这个类的结构 比如描述一个类有哪些成员 有哪些方法等 一
  • Java通过反射获取注解以及注解中的信息

    首先自定义两个注解 1 用于描述表名 只能用在类 接口 枚举上 Target ElementType TYPE Retention RetentionPolicy RUNTIME public interface TableName Str
  • Go Web编程实战(6)----反射

    目录 反射 反射的3大原则 接口类型变量 转换为 反射类型对象 反射类型对象 转换为 接口类型变量 反射类型对象 修改 值必 可写的 反射 与其他语言一样 Go语言的反射同样是指 计算机程序在运行时 可以访问 检测和修改它本身状态或行为的一

随机推荐

  • 七校联合NewStarCTF 公开赛赛道WEEK2 web wp

    也不知道是不是公开赛和内部赛是不是同一套题 week1的题挺简单的 这里小记一下week2的题目 如有侵权立刻删除 Word For You 2 Gen 这题很简单就带过一下吧 报错注入就行 1 updatexml 1 concat 0x7
  • 数据挖掘 决策树算法 ID3 通俗演绎

    决策树是对数据进行分类 以此达到 预测的目的 该决策树方法先根据训练集数据形成决策树 如果该树不能对所有对象给出正确的分类 那么选择一些例外加入到训练集数据中 重复该过程一直到形成正确的决策集 决策树代表着决策集的树形结构 决策树由决策结点
  • Openwrt下设置程序开机自动启动

    转自http www cnyubin com p 364 今天在使用Openwrt时 需要将scp到上面的程序设置为开机自动启动 按照Linux下设置自动启动的方法并不有效 后来在官方wiki下发现了介绍文章 具体可见Openwrt下htt
  • Epoll图解

    图解 Epoll怎么实现的 51CTO COM epoll详解 Ineffable 的博客 CSDN博客 epoll详解
  • Nginx健康检查

    0 背景 服务治理的一个重要任务是感知服务节点变更 完成服务自动注册及异常节点的自动摘除 这就需要服务治理平台能够 及时 准确的感知service节点的健康状况 1 方案概述 Nginx 提供了三种HTTP服务健康检查方案供用户选择 1 T
  • 三面阿里被挂,竟获内推名额,历经 5 面拿下口碑 offer...

    每一个互联网人心中都有一个大厂梦 百度 阿里巴巴 腾讯是很多互联网人梦寐以求的地方 而我也不例外 但是 BAT 等一线互联网大厂并不是想进就能够进的 它对人才的技术能力和学历都是有一定要求的 所以除了学历以外 我们的技术和能力都要过硬才行
  • win10微信打电话对方听不到你的声音,你能听到对方声音

    1 隐私权限 开始 设置 隐私 麦克风 更改 开启权限 2 禁用占用问题 右键电脑右下角小喇叭 声音 声音控制面板 录制 分别右键下面的几个选项 启用麦克风 立体声混音等 然后分别双击下面的麦克风 立体声等选项 高级 独占前面的v取消 确定
  • 拯救小tim【最短路】

    题目链接 这里有一个坑点 譬如说 我们从S出发的时间 不是刚好卡着第一个的 起始点 没准出发的第一步 没有卡起始点 而是在后面的到达其他点的时候卡了起始点这样的情况 所以我们应该从0 max BegTim的来枚举起点时间 然后跑Dijkst
  • javamail发送接收的简单demo

    目录结构 首先引入文件
  • 23考研重大软院数一英一391分经验帖

    今年这情况之后 所有前人的经验帖作废 前言 本校本专业生一战上岸 属于考研界难度最低的一档 今年有个初试439的怪物 属于是蚌了 第二名也有419 第三名就断档了 我初试第五 政治78 英一75 数一115 专业课123 总分391分 可以
  • [个人笔记] vCenter设置时区和NTP同步

    VMware虚拟化 运维篇 第三章 vCenter设置时区和NTP同步 VMware虚拟化 运维篇 系列文章回顾 vCenter设置时区和NTP同步 附加 ESXi设置alias 参考链接 系列文章回顾 第一章 vCenter给虚机添加RD
  • 鼓励参与计算机考试宣传标语,考试宣传标语

    考试标语 1 遵守考场纪律 维护知识尊严 2 提倡诚信做人 纯洁校园风气 3 考前不慌不乱 考时沉着应对 考后杜绝议论 4 用心看卷 专心答题 细心复查 5 我自信 我成功 6 与诚信携手同行与舞弊挥手作别 7 怀轻松心情进考场 带胜利喜悦
  • 安全https,dns笔记整理

    一 https HTTP 是用于从万维网 WWW World Wide Web 服务器传输超文本到本地浏览器的传送协议 他是一种应用层协议 是基于 TCP IP 通信协议来传递数据的 但他不安全 以明文传递的方式 容易被他人盗取篡改信息 H
  • java 提取存在逗号和小数点的字符串中的数字

    可以使用正则表达式来处理 以下是一个示例代码 可以提取字符串中可能包含逗号和小数点的数字 import java util regex Matcher import java util regex Pattern public class
  • Arduino和Python实时监督控制和数据采集系统(SCADA)

    本文 将向您展示如何设置环境温度信号 该信号将通过计算机上的实时仪表板记录和可视化数据 硬件设计 首先 我们将使用Arduino Uno开发板从红外温度计读取温度值 如上所示连接红外测温仪后 继续将以下程序上传到Arduino 要验证Ard
  • 如何在windows下切换node版本

    解决办法 1 用到某个版本对node重新卸载 安装对应的版本 2 使用nvm 很明显 第一种方法虽然也能解决node版本问题 但是太多麻烦 接下来介绍下nvm的安装使用 第一步 下载nvm并安装 推荐使用nvm setup zip nvm
  • ROS配置LTE第二链路实现故障自动切换

    本文几乎没有操作部分 主要是讲原理 设备是RB962 通过PPPoE方式上网 华为5577移动路由器配合电信日租卡作为第二链路备用 计划实现宽带正常时通过PPPoE线路上网 异常时通过LTE线路上网 PPPoE线路恢复正常时 流量回到PPP
  • 第37.2节 框选-框选场景中的物体

    目录 本节内容 实现要点 点选 性能 绘制球 本节内容 结合上一节 我们把框选这个功能给完善了 如下 白色的是我点击左CTRL 用鼠标左键在场景中拉的框 拉框的教程在第37 1节 框选 绘制框选框 拉完框后能够将场景中选择的物体置红 本节代
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(十二)光照贴图

    Vries的原教程地址如下 https learnopengl cn github io 02 20Lighting 04 20Lighting 20maps 关于OpenGL函数的详细解析及OpenGL关于满反射贴图与镜面反射贴图的知识点
  • 反射的使用

    反射 一 反射基本概念 1 反射是什么 2 Class类实例对象是什么 Field类实例对象和Method类实例对象是什么 3 jVM类加载机制 很难又很重要 待补充 二 反射的作用 三 Class详解 Class的使用场景 1 通过对象获