Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 324|回复: 0

[Java反射学习]Java反射经典实例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-31 23:58:23 | 显示全部楼层 |阅读模式
    java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫――反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。

    1. 得到某个对象的属性

      
       
         
        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. 得到某个类的静态属性


       
         
         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. 执行某对象的方法

      

      
      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
    =
      args.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):通过Method名和参数的Class数组得到要执行的Method。

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


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



      
      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
    =
      args.getClass();

      9
         }

    10


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

    12


    13
         
    return
      method.invoke(
    null
    , args);

    14
    }


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



    5. 新建实例


      
      1


      2

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

      3
         Class newoneClass
    =
      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
    =
      args.getClass();

      9
         }

    10


    11
         Constructor cons
    =
      newoneClass.getConstructor(argsClass);

    12


    13
         
    return
      cons.newInstance(args);

    14


    15
    }


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

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

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

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

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


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



      
    1
    public
      
    boolean
      isInstance(Object obj, Class cls) {

    2
         
    return
      cls.isInstance(obj);

    3
    }



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


      
    1
    public
      Object getByArray(Object array,
    int
      index) {

    2
         
    return
      Array.get(array,index);

    3
    }



    附完整源码:



      
       import java.lang.reflect.Array;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;


    /**
      * Java Reflection Cookbook
      *
      * @author Michael Lee
      * @since 2006-8-23
      * @version 0.1a
      */

    public class Reflection {
         /**
          * 得到某个对象的公共属性
          *
          * @param owner, fieldName
          * @return 该属性对象
          * @throws Exception
          *
          */
         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;
         }

         /**
          * 得到某类的静态公共属性
          *
          * @param className   类名
          * @param fieldName   属性名
          * @return 该属性对象
          * @throws Exception
          */
         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;
         }


         /**
          * 执行某对象方法
          *
          * @param owner
          *            对象
          * @param methodName
          *            方法名
          * @param args
          *            参数
          * @return 方法返回值
          * @throws Exception
          */
         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 = args.getClass();
             }

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

             return method.invoke(owner, args);
         }


           /**
          * 执行某类的静态方法
          *
          * @param className
          *            类名
          * @param methodName
          *            方法名
          * @param args
          *            参数数组
          * @return 执行方法返回的结果
          * @throws Exception
          */
         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 = args.getClass();
             }

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

             return method.invoke(null, args);
         }



         /**
          * 新建实例
          *
          * @param className
          *            类名
          * @param args
          *            构造函数的参数
          * @return 新建的实例
          * @throws Exception
          */
         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 = args.getClass();
             }

             Constructor cons = newoneClass.getConstructor(argsClass);

             return cons.newInstance(args);

         }
       
         /**
          * 是不是某个类的实例
          * @param obj 实例
          * @param cls 类
          * @return 如果 obj 是此类的实例,则返回 true
          */
         public boolean isInstance(Object obj, Class cls) {
             return cls.isInstance(obj);
         }
         
         /**
          * 得到数组中的某个元素
          * @param array 数组
          * @param index 索引
          * @return 返回指定数组对象中索引组件的值
          */
         public Object getByArray(Object array, int index) {
             return Array.get(array,index);
         }
    }
      
       
       
         
         

          
         

          
         
       
      
       


    源码下载:http://file.javaxxz.com/2014/10/31/235823421.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 01:54 , Processed in 0.375902 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表