问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java:描述反射机制的作用?举几个反射的应用?

发布网友 发布时间:2022-04-25 16:06

我来回答

2个回答

热心网友 时间:2023-02-07 07:51

说多多的也没用,我就简单给你介绍几个。既然你学了Java,那么反射就算你不会,你在学习过程中也会经常遇到。1、有了反射机制,那么就能逆向代码了,反编译器就是这个原理。2、像流行的框架,Spring,Hibernate等,就是利用反射机制,要不然怎么可能你配置下文件就完事呢3、动态生成类啊,当然spring里面都用到了。希望我的回答对你有帮助!

热心网友 时间:2023-02-07 09:09

比较全的解释了: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 }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
宝石花的养殖方法介绍 宝石花怎么养才长得好 不想让老婆看到我电脑里的一些东西怎么办? 桥好路由器停电后在来电老是获取lp 勒索病毒加密的文件如何恢复? TPU贴合膜多少钱 华为手机如何将输入法改为简体 肉丝炒金针菇做法 仓储冷链信息怎么申报 什么是药品冷链物流 浙江食品冷链运输多少钱 JAVA-什么是反射,请问大白话,解释一下 小天才平板怎么下载小红书吗 说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要... GCCX的6.69的法币是多少人民币?买进来后能买多少个GCNT? java中的反射怎么用?怎么理解反射? 怎么在word里面打出想弓箭箭头? gcnt是什么货币 阴道里有像豆腐渣一样的东西经常抠私密处有影响吗 java里反射我这么理解对不对? 在word中如何输入如下箭头? 未来月经的女生为什么阴道总残留有豆腐 下列有关反射的说法正确的是? WORD如何输入空心的向上和向下箭头?高手指点啊 谢谢了 (和=&gt;差不读 只是方向是上下 ) 永恒冒险GC币10元总换卷怎么用啊? 私密处瘙痒还有豆腐渣一样的东西是怎么回事? java 反射 下列关于通过反射方式获取方法并执行的过程说法正确的是( ) ----- 多选 私密处有异味,白带呈豆渣状 哪个数字货币平台安全,dcpro平台可以么? 私处有豆腐渣状用什么药? 光彩集团慈善币GC币 如何重新下载小红书? 宝宝的衣服发黄了怎么洗干净,各位宝妈有妙招吗 洗衣液怎么选好?宝宝衣服容易脏,用什么产品洗,可以洗得干干净净的? 中国银行批量打印电子回单 农行打印回单一页打3个原来可以现在第3个的两张 广发银行账户明细回单怎么批量打印 建行网银打印电子回单怎么把2张打印在一张上 怎样登录中国裁判文书网 怎样登录中国裁判文书网? 中国裁判文书网 农行打印对账单回单如何设置一张A4纸打印二张回单? 中行企业网银电子回单怎么打到一张纸上 在word中如何把表格中怎样花向上的箭头 中国裁判文书网保留多久 pdf里面有三个回单我怎么可以一个回单打印一张? 这样的箭头在word里面怎样打出来 中国裁判文书网为啥进不去? 一页PDF上有三个银行电子回单,能不能设置打印成三张A4纸,一页一个回单? 哪位知道网上银行回单可以同时打印几份的吗?一个一个好麻烦 怎么登录中国裁判网?