Java反射经典实例

(java)反射的用法以及示例 主要介绍了常用的反射方法以及通过有效类全名获取类信息的实例 阅读详情

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。

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

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用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. }  


附完整源码:

 

  1. import java.lang.reflect.Array;  
  2. import java.lang.reflect.Constructor;  
  3. import java.lang.reflect.Field;  
  4. import java.lang.reflect.Method;  
  5.   
  6. /** 
  7. * Java Reflection Cookbook 
  8. * 
  9. * @author Michael Lee 
  10. * @since 2006-8-23 
  11. * @version 0.1a 
  12. */  
  13. public class Reflection {  
  14.     /** 
  15.      * 得到某个对象的公共属性 
  16.      * 
  17.      * @param owner, fieldName 
  18.      * @return 该属性对象 
  19.      * @throws Exception 
  20.      * 
  21.      */  
  22.     public Object getProperty(Object owner, String fieldName) throws Exception {  
  23.         Class ownerClass = owner.getClass();  
  24.         Field field = ownerClass.getField(fieldName);  
  25.         Object property = field.get(owner);  
  26.         return property;  
  27.     }  
  28.     /** 
  29.      * 得到某类的静态公共属性 
  30.      * 
  31.      * @param className   类名 
  32.      * @param fieldName   属性名 
  33.      * @return 该属性对象 
  34.      * @throws Exception 
  35.      */  
  36.     public Object getStaticProperty(String className, String fieldName)  
  37.             throws Exception {  
  38.         Class ownerClass = Class.forName(className);  
  39.         Field field = ownerClass.getField(fieldName);  
  40.         Object property = field.get(ownerClass);  
  41.         return property;  
  42.     }  
  43.   
  44.     /** 
  45.      * 执行某对象方法 
  46.      * 
  47.      * @param owner 
  48.      *            对象 
  49.      * @param methodName 
  50.      *            方法名 
  51.      * @param args 
  52.      *            参数 
  53.      * @return 方法返回值 
  54.      * @throws Exception 
  55.      */  
  56.     public Object invokeMethod(Object owner, String methodName, Object[] args)  
  57.             throws Exception {  
  58.         Class ownerClass = owner.getClass();  
  59.         Class[] argsClass = new Class[args.length];  
  60.         for (int i = 0, j = args.length; i < j; i++) {  
  61.             argsClass[i] = args[i].getClass();  
  62.         }  
  63.         Method method = ownerClass.getMethod(methodName, argsClass);  
  64.         return method.invoke(owner, args);  
  65.     }  
  66.   
  67.       /** 
  68.      * 执行某类的静态方法 
  69.      * 
  70.      * @param className 
  71.      *            类名 
  72.      * @param methodName 
  73.      *            方法名 
  74.      * @param args 
  75.      *            参数数组 
  76.      * @return 执行方法返回的结果 
  77.      * @throws Exception 
  78.      */  
  79.     public Object invokeStaticMethod(String className, String methodName,  
  80.             Object[] args) throws Exception {  
  81.         Class ownerClass = Class.forName(className);  
  82.         Class[] argsClass = new Class[args.length];  
  83.         for (int i = 0, j = args.length; i < j; i++) {  
  84.             argsClass[i] = args[i].getClass();  
  85.         }  
  86.         Method method = ownerClass.getMethod(methodName, argsClass);  
  87.         return method.invoke(null, args);  
  88.     }  
  89.     /** 
  90.      * 新建实例 
  91.      * 
  92.      * @param className 
  93.      *            类名 
  94.      * @param args 
  95.      *            构造函数的参数 
  96.      * @return 新建的实例 
  97.      * @throws Exception 
  98.      */  
  99.     public Object newInstance(String className, Object[] args) throws Exception {  
  100.         Class newoneClass = Class.forName(className);  
  101.         Class[] argsClass = new Class[args.length];  
  102.         for (int i = 0, j = args.length; i < j; i++) {  
  103.             argsClass[i] = args[i].getClass();  
  104.         }  
  105.         Constructor cons = newoneClass.getConstructor(argsClass);  
  106.         return cons.newInstance(args);  
  107.     }  
  108.   
  109.       
  110.     /** 
  111.      * 是不是某个类的实例 
  112.      * @param obj 实例 
  113.      * @param cls 类 
  114.      * @return 如果 obj 是此类的实例,则返回 true 
  115.      */  
  116.     public boolean isInstance(Object obj, Class cls) {  
  117.         return cls.isInstance(obj);  
  118.     }  
  119.       
  120.     /** 
  121.      * 得到数组中的某个元素 
  122.      * @param array 数组 
  123.      * @param index 索引 
  124.      * @return 返回指定数组对象中索引组件的值 
  125.      */  
  126.     public Object getByArray(Object array, int index) {  
  127.         return Array.get(array,index);  
  128.     }  
  129. }  

Java 8个反射实例 Java 8个反射实例 项目实例 项目工程 立即下载

相关推荐

避坑指南:CST粒子工作室Track Solver常见的5个参数设置错误

本文深入剖析了CST粒子工作室中Track Solver在电子枪仿真时常见的5个关键参数设置错误,包括空间电荷模型选择、发射源定义、材料边界处理、监视器配置及求解器稳定性设置。通过对比错误与正确做法,帮助用户避开陷阱,确保粒子追踪仿真的物理准确性与数值稳定性,从而获得更精准的电子枪仿真结果。

dapp9builder的博客 486

java反射实操案例

一、反射介绍: 二、常用反射操作: 1、获取类对应的字节码对象(后缀为.class): (1)类对象.getClass() (2)类名.class (3)Class.forname("类的路径") 2、获取了类的Class对象后,可通过该字节码对象获取该类的多种信息 (1)测试用的学生类: (2)得到类属性的方法: (3)得到类方法的方法: (4)通过获取字节码,进而创建对象: (5)通过字节码对象获取包名、类名:

zhan_qian的博客 1802

ADC INL&DNL测试方法和实例

本文介绍了一种可操作的ADC INL和DNL的测试方法--直方图法(也称码密度法)。并实际使用该方法测试了两款芯片的ADC INL和DNL

APTCHIP的博客 1万+

关于Java反射的详解及实战案例

需求如下:我现在引入了一个第三方 jar 包,里面有一个 MyBatis-Plus 查询构造器,其中构造 LIKE条件查询的条件是当前端传过来的参数带有逗号时,拼接为LIKE查询条件。关键代码:标识在对象的某个成员属性上​​复制代码标识在Controller层上,以此来判断那些请求是需要被切入的。​​复制代码一个非常简单的Javabean@Data​​​​​复制代码Controller 类@Slf4j​​复制代码。

Java技术攻略的博客 968

Cluster Computing投稿

在overleaf中新建picins.sty文件,该文件是导入的包在.tex文件中添加以下内容\usepackage{picins}%实现作者简介%下边这块有几个人复制几段\vspace{0\baselineskip} %这一行控制作者间隔,可视情况改数字!!!!!!!!

这里是萤石ym的学习路途,努力搬砖! 5534

二、时间序列的预处理

一般情况下,拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。 一、平稳性检验 1、特征统计量 (1)概率分布           数理统计的基础知识告诉我们分布函数或者密度函数能够完整地描述一个随机变量的统计特征。同样,一个堆积变量族{Xt} 的统计特征也完全由...

Nicole的博客 2万+

Java-反射(有图有例子,清晰易懂)

反射:框架设计的灵魂 1、概念 Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。 框架:半成品软件,可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装成其他对象(Field,Constructor,Method),这就是反射机制 好处(见第四点) 可以再程序运行过程中,操作这些对象 可以解耦,提高程序的可扩展性 2、获取Class对象的方式 什么是Class类? ​ Clas

qq_25046827的博客 1734

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1731

Java 反射详解及示例代码

反射(Reflection)是Java中一种强大的机制,允许我们在运行时检查和操作类、接口、字段和方法。借助反射,我们可以动态地创建对象、调用方法,以及读取和修改属性值。

weixin_43854959的博客 1536

别再对着数据手册发愁了!用HFSS 2023 R2搞定ESP32-C3板载天线的阻抗匹配

本文详细介绍了如何利用HFSS 2023 R2进行ESP32-C3板载天线的阻抗匹配优化,解决实际PCB设计中常见的性能偏差问题。通过智能模型导入、科学参数扫描和量化优化流程,显著提升天线性能,适用于WIFI和蓝牙应用场景。

weixin_42523543的博客 447

10.2 在新能源、储能及电网节点的应用实践

构网型变流器技术在电力系统中的应用进展 构网型变流器技术正从理论研究走向规模化工程应用,为新能源并网提供主动支撑能力。该技术在光伏电站采用"部分构网"混合架构,由构网单元实现黑启动和弱网稳定;在风电场利用叶轮动能提供惯量响应。储能系统是理想的构网载体,可提供快速调频和动态电压支撑。在电网节点,构网型STATCOM可增强弱电网电压稳定性,大容量变流器可替代传统调相机。当前面临标准滞后、宽频振荡风险等共性挑战,需在可靠性、经济性间取得平衡。系统级协调控制和精确阻抗建模是应用成功的关键。

技术工作者 1109

Java经典反射实例

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性Java代码 public Object getProperty(Object owner, String fieldNam

wiseq的专栏 1113

CE电流法测试中的dBμV负值解析

传导发射(CE)电流法测试中出现的dBμV负值现象表明被测设备干扰电平低于1μV参考基准。这源于对数计算特性(小于1μV的电压转换后为负值)、设备优良的EMC设计(如滤波效果显著)及测试环境的影响(LISN隔离、屏蔽室低噪声)。负值虽不代表实际负电压,但反映干扰水平优于标准限值,为系统集成预留电磁裕度。工程应用中需结合设备灵敏度、环境背景噪声等因素综合分析,避免误判,这类数据可用于评估EMI设计冗余度。

硬核科技 298

Java反射经典实例 Java Reflection Cookbook

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性Code highlighting produced by Actipro CodeHighlighter (freeware)http

Nomad & His Life 4114

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

java反射例子_Java反射经典实例

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性public Object getProperty(Object owner, String fieldName) throws Excep...

weixin_39801356的博客 335

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java反射经典实例 Java Reflection

http://jeplove.blog.zj.com/blog/d-229345.html   Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性 1 public Object ge...

liuchaoyong 181

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java反射经典实例

Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。1. 得到某个对象的属性public Object getProperty(Object owner, String fieldName) throws E

hujingn的博客 785

java反射创建数组,Java反射经典实例

importjava.lang.reflect.Array;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;importjava.lang.reflect.Method;/***JavaReflectionCookbook**@authorMichaelLee*@since2006-8-23*@versio...

weixin_36296827的博客 235
上一篇: Java反射经典实例
下一篇: 推荐阅读:《我在赶集网的两个月(完整版)》
Java_Cowboy
博客等级 码龄19年 59粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值