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

    相关文章

    Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

    《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

    在Spring Boot中浅尝内存泄漏的实战记录

    《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

    SpringBoot集成Milvus实现数据增删改查功能

    《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

    浅析Java中如何优雅地处理null值

    《浅析Java中如何优雅地处理null值》这篇文章主要为大家详细介绍了如何结合Lambda表达式和Optional,让Java更优雅地处理null值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录场景 1:不为 null 则执行场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常场景

    python logging模块详解及其日志定时清理方式

    《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

    前端CSS Grid 布局示例详解

    《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

    Node.js 数据库 CRUD 项目示例详解(完美解决方案)

    《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

    SQL表间关联查询实例详解

    《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

    SpringMVC获取请求参数的方法

    《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

    shell编程之函数与数组的使用详解

    《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的