java反射机制详解 及 Method.invoke解释 getMethod

2024-01-21 04:59

本文主要是介绍java反射机制详解 及 Method.invoke解释 getMethod,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

赠书 | 异步2周年,技术图书免费选     每周荐书:分布式、深度学习算法、iOS(评论送书)     项目管理+代码托管+文档协作,开发更流畅

java反射机制详解 及 Method.invoke解释 getMethod

标签: javaclassobjectexceptionstringconstructor
50178人阅读 评论(2) 收藏 举报
分类:
作者同类文章 X

    Java反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
    1. 得到某个对象的属性

    public Object getProperty(Object owner, String fieldName) throws Exception {   

         Class ownerClass = owner.getClass();   

         Field field = ownerClass.getField(fieldName);   

         Object property = field.get(owner);   

         return property;   

    }  

    public Object getProperty(Object owner, String fieldName) throws Exception {   

         Class ownerClass = owner.getClass();   

         Field field = ownerClass.getField(fieldName);   

         Object property = field.get(owner);   

         return property;   

    }  

    [java] view plain copy
    print ?
    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. }  
    public Object getProperty(Object owner, String fieldName) throws Exception {Class ownerClass = owner.getClass();Field field = ownerClass.getField(fieldName);Object property = field.get(owner);return property;
    }
    

     
    Class ownerClass = owner.getClass():得到该对象的Class。

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

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

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

    public Object getStaticProperty(String className, String fieldName)   

                 throws Exception {   

         Class ownerClass = Class.forName(className);   

         Field field = ownerClass.getField(fieldName);   

         Object property = field.get(ownerClass);   

         return property;   

    }  

    public Object getStaticProperty(String className, String fieldName)   

                 throws Exception {   

         Class ownerClass = Class.forName(className);   

         Field field = ownerClass.getField(fieldName);   

         Object property = field.get(ownerClass);   

         return property;   

    }  

    [java] view plain copy
    print ?
    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. }  
    public Object getStaticProperty(String className, String fieldName)throws Exception {Class ownerClass = Class.forName(className);Field field = ownerClass.getField(fieldName);Object property = field.get(ownerClass);return property;
    }
    

     

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

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

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

    3. 执行某对象的方法

    public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {   

         Class ownerClass = owner.getClass();   

         Class[] argsClass = new Class[args.length];   

         for (int i = 0, j = args.length; i < j; i++) {   

             argsClass[i] = args[i].getClass();   

         }   

          Method method = ownerClass.getMethod(methodName,argsClass);   

         return method.invoke(owner, args);   

    }  

    public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {   

         Class ownerClass = owner.getClass();   

         Class[] argsClass = new Class[args.length];   

         for (int i = 0, j = args.length; i < j; i++) {   

             argsClass[i] = args[i].getClass();   

         }   

          Method method = ownerClass.getMethod(methodName,argsClass);   

         return method.invoke(owner, args);   

    }  

    [java] view plain copy
    print ?
    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. }  
    public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {Class ownerClass = owner.getClass();Class[] argsClass = new Class[args.length];for (int i = 0, j = args.length; i < j; i++) {argsClass[i] = args[i].getClass();}Method method = ownerClass.getMethod(methodName,argsClass);return method.invoke(owner, args);
    }
    

     
    Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

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

    Method method = ownerClass.getMethod(methodName, argsClass):通过methodName和参数的argsClass(方法中的参数类型集合)数组得到要执行的Method。

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

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

    public Object invokeStaticMethod(String className, String methodName,   

                 Object[] args) throws Exception {   

         Class ownerClass = Class.forName(className);   

         Class[] argsClass = new Class[args.length];   

         for (int i = 0, j = args.length; i < j; i++) {   

             argsClass[i] = args[i].getClass();   

         }   

        Method method = ownerClass.getMethod(methodName,argsClass);   

         return method.invoke(null, args);   

     }  

    public Object invokeStaticMethod(String className, String methodName,   

                 Object[] args) throws Exception {   

         Class ownerClass = Class.forName(className);   

         Class[] argsClass = new Class[args.length];   

         for (int i = 0, j = args.length; i < j; i++) {   

             argsClass[i] = args[i].getClass();   

         }   

        Method method = ownerClass.getMethod(methodName,argsClass);   

         return method.invoke(null, args);   

     }  

    [java] view plain copy
    print ?
    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.  }  
    public Object invokeStaticMethod(String className, String methodName,Object[] args) throws Exception {Class ownerClass = Class.forName(className);Class[] argsClass = new Class[args.length];for (int i = 0, j = args.length; i < j; i++) {argsClass[i] = args[i].getClass();}Method method = ownerClass.getMethod(methodName,argsClass);return method.invoke(null, args);}
    

     

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

    5. 新建实例

    public Object newInstance(String className, Object[] args) throws Exception {   

         Class newoneClass = Class.forName(className);   

         Class[] argsClass = new Class[args.length];   

         for (int i = 0, j = args.length; i < j; i++) {   

             argsClass[i] = args[i].getClass();   

         }   

         Constructor cons = newoneClass.getConstructor(argsClass);   

         return cons.newInstance(args);   

    }  

    public Object newInstance(String className, Object[] args) throws Exception {   

         Class newoneClass = Class.forName(className);    

         Class[] argsClass = new Class[args.length];   

         for (int i = 0, j = args.length; i < j; i++) {   

             argsClass[i] = args[i].getClass();   

         }   

         Constructor cons = newoneClass.getConstructor(argsClass);   

        return cons.newInstance(args);   

    }  

    [java] view plain copy
    print ?
    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. }  
    public Object newInstance(String className, Object[] args) throws Exception {Class newoneClass = Class.forName(className);Class[] argsClass = new Class[args.length];for (int i = 0, j = args.length; i < j; i++) {argsClass[i] = args[i].getClass();}Constructor cons = newoneClass.getConstructor(argsClass);return cons.newInstance(args);}
    

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

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

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

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

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

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

    public boolean isInstance(Object obj, Class cls) {   

         return cls.isInstance(obj);   

    }  

    public boolean isInstance(Object obj, Class cls) {   

     return cls.isInstance(obj);   

    }  

    [java] view plain copy
    print ?
    1. public boolean isInstance(Object obj, Class cls) {  
    2.      return cls.isInstance(obj);  
    3. }  
    public boolean isInstance(Object obj, Class cls) {return cls.isInstance(obj);
    }
    

     
    7. 得到数组中的某个元素

    public Object getByArray(Object array, int index) {   

         return Array.get(array,index);   

    }  

     

    1
    4
    相关文章推荐
    • [Java数据结构]从源码分析HashMap
    • Method Class.getMethod(String name, Class<?>... parameterTypes)
    • HashMap,LinkedHashMap,TreeMap的区别
    • HashMap与ConcurrentHashMap的区别
    • 反射 method的调用 无参和多参数
    • java反射机制 及 Method.invoke,Class. getMethod()的使用
    • HttpClient使用Post和Get提交参数
    • Method详解
    • 反射得到参数化类型中的类型参数
    • java jni GetFieldID 和 GetMethodID 以及参数的说明
    猜你在找
    【直播】机器学习&数据挖掘7周实训--韦玮
    【套餐】系统集成项目管理工程师顺利通关--徐朋
    【直播】3小时掌握Docker最佳实战-徐西宁
    【套餐】机器学习系列套餐(算法+实战)--唐宇迪
    【直播】计算机视觉原理及实战--屈教授
    【套餐】微信订阅号+服务号Java版 v2.0--翟东平
    【直播】机器学习之矩阵--黄博士
    【套餐】微信订阅号+服务号Java版 v2.0--翟东平
    【直播】机器学习之凸优化--马博士
    【套餐】Javascript 设计模式实战--曾亮
    查看评论
    2楼 qq_21262673 2016-12-20 14:02发表 [回复] [引用] [举报]
    写的不错哟
    1楼 zyj11023754 2016-09-21 14:50发表 [回复] [引用] [举报]
    讲真的,真是看不懂,底子太薄了
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    快速回复 TOP
    • 个人资料

    • ff313976
      • 访问:226115次
      • 积分:2150
      • 等级:
        积分:2150
      • 排名:第17547名
      • 原创:25篇
      • 转载:83篇
      • 译文:1篇
      • 评论:16条
    • 文章分类
    • android(67)
    • C++(7)
    • 其他(11)
    • 网络相关(2)
    • ios(3)
    • java(2)
    • OpenGL(2)
    • 工具(7)
    • cocos2d(5)
    • 文章存档
      • 2017年01月(1)
      • 2016年10月(2)
      • 2016年05月(1)
      • 2016年04月(1)
      • 2016年01月(1)
      • 2015年12月(3)
      • 2015年10月(1)
      • 2015年09月(1)
      • 2015年08月(1)
      • 2015年07月(1)
      • 2015年05月(1)
      • 2015年04月(2)
      • 2015年03月(3)
      • 2015年02月(1)
      • 2015年01月(2)
      • 2014年12月(1)
      • 2014年10月(3)
      • 2014年09月(13)
      • 2014年04月(7)
      • 2014年03月(1)
      • 2014年02月(1)
      • 2013年11月(2)
      • 2013年10月(1)
      • 2013年09月(6)
      • 2013年08月(4)
      • 2013年07月(2)
      • 2013年06月(1)
      • 2013年04月(1)
      • 2013年03月(4)
      • 2013年02月(1)
      • 2013年01月(2)
      • 2012年11月(2)
      • 2012年10月(1)
      • 2012年09月(5)
      • 2012年08月(7)
      • 2012年07月(1)
      • 2012年06月(8)
      • 2012年05月(4)
      • 2012年04月(3)
      • 2012年03月(1)
      • 2011年12月(1)
      • 2011年11月(2)
      • 2011年10月(2)
        展开
    • 阅读排行
    • java反射机制详解 及 Method.invoke解释 getMethod(50081)
    • TypedArray和obtainStyledAttributes使用(33662)
    • Android 5.0 Service Intent must be explicit(7323)
    • getQuantityString(6521)
    • 一些包名(5333)
    • android textview 排版混乱问题(4450)
    • ScrollView 与 viewpager冲突问题(4338)
    • Android 的main.mk完整分析(4239)
    • 关于Android的Activity的onCreate多次调用的问题(3601)
    • android仿QQ列表实现(3377)
    • 评论排行
    • 一些包名(3)
    • ScrollView 与 viewpager冲突问题(3)
    • java反射机制详解 及 Method.invoke解释 getMethod(2)
    • android 自定义键盘碰到的问题及解决方法(2)
    • android textview 排版混乱问题(2)
    • 关于Android的Activity的onCreate多次调用的问题(1)
    • getQuantityString(1)
    • JNI中文乱码转换(1)
    • TypedArray和obtainStyledAttributes使用(1)
    • JAVA关于抓取网页数据(不用正则)(0)
    • 推荐文章
      • * CSDN日报20170725——《新的开始,从研究生到入职亚马逊》
      • * 深入剖析基于并发AQS的重入锁(ReetrantLock)及其Condition实现原理
      • * Android版本的"Wannacry"文件加密病毒样本分析(附带锁机)
      • * 工作与生活真的可以平衡吗?
      • * 《Real-Time Rendering 3rd》 提炼总结——高级着色:BRDF及相关技术
      • * 《三体》读后思考-泰勒展开/维度打击/黑暗森林
    • 最新评论
    • java反射机制详解 及 Method.invoke解释 getMethod

      qq_21262673:写的不错哟

    • getQuantityString

      AudienL:好,谢了。

    • java反射机制详解 及 Method.invoke解释 getMethod

      zyj11023754:讲真的,真是看不懂,底子太薄了

    • 一些包名

      夜之莺:谢谢分享!!!

    • JNI中文乱码转换

      丧尽心:这样转换大部分可以转,不过我转换"中文测试"这四个字时尾部会有多一个乱码字符

    • android textview 排版混乱问题

      ff313976:@u014798222:说我抄袭的,请把原文链接给出来

    • 一些包名

      hanlongljj:不错的分享。

    • android textview 排版混乱问题

      百信-李建:楼主抄袭也不能这样

    • 一些包名

      qq_16109091:谢谢分享~~~

    • android 自定义键盘碰到的问题及解决方法

      ff313976:@lszemperor:我这个是在frameworks里面加的,不是单个app。要在系统里编译才可以...

    这篇关于java反射机制详解 及 Method.invoke解释 getMethod的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



    http://www.chinasem.cn/article/628424

    相关文章

    JavaScript中的isTrusted属性及其应用场景详解

    《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

    Java循环创建对象内存溢出的解决方法

    《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

    使用Python实现操作mongodb详解

    《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

    Java CompletableFuture如何实现超时功能

    《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

    一文详解Python中数据清洗与处理的常用方法

    《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

    Java中Object类的常用方法小结

    《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

    SpringBoot项目中Maven剔除无用Jar引用的最佳实践

    《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

    SpringBoot实现动态插拔的AOP的完整案例

    《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

    详解如何在React中执行条件渲染

    《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

    详解Vue如何使用xlsx库导出Excel文件

    《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三