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

    相关文章

    详解MySQL中DISTINCT去重的核心注意事项

    《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

    Spring @Scheduled注解及工作原理

    《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

    SpringBoot中使用Flux实现流式返回的方法小结

    《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

    Spring Boot 实现 IP 限流的原理、实践与利弊解析

    《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

    Mac系统下卸载JAVA和JDK的步骤

    《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

    SQL BETWEEN 语句的基本用法详解

    《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

    springboot下载接口限速功能实现

    《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

    Java Spring ApplicationEvent 代码示例解析

    《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

    SpringMVC高效获取JavaBean对象指南

    《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

    javax.net.ssl.SSLHandshakeException:异常原因及解决方案

    《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器