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

    相关文章

    SpringBoot实现RSA+AES自动接口解密的实战指南

    《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

    在Java中实现线程之间的数据共享的几种方式总结

    《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

    Go语言使用select监听多个channel的示例详解

    《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

    Linux线程同步/互斥过程详解

    《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

    分布式锁在Spring Boot应用中的实现过程

    《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

    Java使用Thumbnailator库实现图片处理与压缩功能

    《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

    Spring Boot集成/输出/日志级别控制/持久化开发实践

    《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

    Python使用Tenacity一行代码实现自动重试详解

    《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

    破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

    《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

    Springboot项目启动失败提示找不到dao类的解决

    《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编