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

来源:互联网 发布:淘宝广东二手复印机 编辑:程序博客网 时间:2024/06/18 02:15
赠书 | 异步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. }  

     
    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. }  

     

    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. }  

     
    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.  }  

     

    基本的原理和实例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. }  

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

     
    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_212626732016-12-20 14:02发表 [回复] [引用][举报]
    写的不错哟
    1楼 zyj110237542016-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。要在系统里编译才可以...

    阅读全文
    0 0
    原创粉丝点击