问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

Java中的反射机制是什么 我看的秘密糊糊,看不懂

提问网友 发布时间:2022-04-23 04:07
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
5个回答
热心网友 回答时间:2022-04-14 08:33
JAVA反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
1. 得到某个对象的属性

1 public Object getProperty(Object owner, String fieldName) throws Exception {
2 Class ownerClass = owner.getClass();
3
4 Field field = ownerClass.getField(fieldName);
5
6 Object property = field.get(owner);
7
8 return property;
9 }
Class ownerClass = owner.getClass():得到该对象的Class。

Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。

2. 得到某个类的静态属性

1 public Object getStaticProperty(String className, String fieldName)
2 throws Exception {
3 Class ownerClass = Class.forName(className);
4
5 Field field = ownerClass.getField(fieldName);
6
7 Object property = field.get(ownerClass);
8
9 return property;
10 }

Class ownerClass = Class.forName(className) :首先得到这个类的Class。

Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。

Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。

3. 执行某对象的方法

1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
2
3 Class ownerClass = owner.getClass();
4
5 Class[] argsClass = new Class[args.length];
6
7 for (int i = 0, j = args.length; i < j; i++) {
8 argsClass[i] = args[i].getClass();
9 }
10
11 Method method = ownerClass.getMethod(methodName, argsClass);
12
13 return method.invoke(owner, args);
14 }
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

5~9行:配置参数的Class数组,作为寻找Method的条件。

Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。

method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。

4. 执行某个类的静态方法

1 public Object invokeStaticMethod(String className, String methodName,
2 Object[] args) throws Exception {
3 Class ownerClass = Class.forName(className);
4
5 Class[] argsClass = new Class[args.length];
6
7 for (int i = 0, j = args.length; i < j; i++) {
8 argsClass[i] = args[i].getClass();
9 }
10
11 Method method = ownerClass.getMethod(methodName, argsClass);
12
13 return method.invoke(null, args);
14 }

基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。

5. 新建实例
1
2 public Object newInstance(String className, Object[] args) throws Exception {
3 Class newoneClass = Class.forName(className);
4
5 Class[] argsClass = new Class[args.length];
6
7 for (int i = 0, j = args.length; i < j; i++) {
8 argsClass[i] = args[i].getClass();
9 }
10
11 Constructor cons = newoneClass.getConstructor(argsClass);
12
13 return cons.newInstance(args);
14
15 }

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。

第5~第9行:得到参数的Class数组。

Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。

cons.newInstance(args):新建实例。

6. 判断是否为某个类的实例

1 public boolean isInstance(Object obj, Class cls) {
2 return cls.isInstance(obj);
3 }

7. 得到数组中的某个元素
1 public Object getByArray(Object array, int index) {
2 return Array.get(array,index);
3 }
热心网友 回答时间:2022-04-14 09:51
楼上说得很详细啊
热心网友 回答时间:2022-04-14 11:26
反射就是拿镜子照自己,java反射就是拿java分析java
热心网友 回答时间:2022-04-14 13:17
上楼的分析太有型了,言简意赅。。

现在见到的答案竟是长篇大论的。。 都是简单的复杂化,复杂的就搞不懂了。。。
热心网友 回答时间:2022-04-14 15:25
它有一些方法,可以得到目标类的一些属性,构造方法及方法。你可以先去看看API对它的解释。
其实反射我也不是很懂,慢慢去研究,与君共勉吧。

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

相关推荐
  • java反射机制及动态代理

    java反射机制及动态代理

    java反射机制及动态代理:目前正在看Hadoop RPC框架的源码,在深入了解这些之前,有一些基础知识需要回顾下。 1. java反射机制及动态代理 2. java网络编程 3. java NIO 先总结下第一个,java反射机制及动态代理的相关知识点: java反射机制 在看与java反射机制相关的代码前,试着
    查看详情
Java中的反射机制的原理和用途是什么? java的反射技术有什么用? 能说一下java的反射机制吗 java的反射机制到底是什么意思 如何理解Java反射机制 java中反射原理,和应用 Java的反射机制是什么,如何实现 java的反射是基于怎样的原理 java反射机制的实现原理 vivo智能手机下载软件怎么打不开? 为什么VIVOy27手机新下载的软件安装后都显示停止运行,重启也不行,怎么办? vivo下载的软件打不开,还显示让通知vivo是怎么回事呀? vivo手机为什么突然打不开应用了。 vivo软件打不开怎么办 vivoY85下载软件打不开白屏? vivo智能手机下载东西软件怎么打不开? 手vivo突然很多软件 无响应打不开 vivo手机软件下载下来却打不开 为什么vivo的很多软件暂停打不开 为什么vivo手机下载的软件打不开? Java Reflection (JAVA反射)机制详解 java中的反射机制是什么?有什么作用呢?求解,谢谢。 什么是JAVA的反射机制?有什么作用? 为什么使用java反射 linux系统下怎么连wifi? 如何在linux上接收wifi图象 linux系统怎么连wifi 如何在Linux系统下开启无线网络? 请问在WPS的表格中,如何给一排函数的结果求和? VM下的linux如何用wifi无线上网 EXCEL或WPS如何将数据分类求和统计? 物理机linux如何连接有线网和无线网? 虎牙直播首充初体验挂件在哪 Linux下如何通过命令行连接wifi 虎牙五级牌子七天初体验是只有七天吗? WPS表格函数,筛选后按类别自动求和,不包含隐藏? 请问为什么linux系统里面不能使用wifi呢? linux系统能使用wifi吗 关于棒棒堂王子 虎牙王者荣耀区哪些是真技术流主播?
Top