• JAVA-Reflect


    JAVA-Reflect:

    一、什么是反射:

    在面向对象的世界里,万事万物皆对象。(普通数据类型不属于对象,但是可以用封装解决这个问题。静态的成员不属于对象,而是属于类的)

    类也是对象,类是java.lang.Class类的实例对象。

     

    比如说现在有一个Foo类

    1 class Foo{
    2     
    3     void print(){
    4         System.out.println("foo");
    5     }
    6 }

    用正常方法表示Foo的对象:

    1 Foo foo1 = new Foo();//foo1就表示出来了

    我们也可以用反射得到Foo的对象:

    Foo这个类也是一个实例对象,Class类的实例对象,如何表示呢

    任何一个类都是Class的实例对象,这个实例对象有三种表示方式

     1         //第一种表示方式(实际在告诉我们任何一个类都有一个隐含的静态成员变量class)
     2         Class c1 = Foo.class;
     3         
     4         //第二中表达方式  已经知道该类的对象通过getClass方法
     5         Class c2 = foo1.getClass();
     6         
     7         
     8         //第三种表达方式
     9         Class c3 = null;
    10         try {
    11             c3 = Class.forName("xx.xx.xx");
    12         } catch (ClassNotFoundException e) {
    13             // TODO Auto-generated catch block
    14             e.printStackTrace();
    15         }

    然后可以通过类的类类型创建该类的对象实例(通过c1 或 c2 或 c3创建Foo的实例对象)

     1         try {
     2             Foo foo = (Foo)c1.newInstance();//需要有无参数的构造方法
     3             foo.print();
     4         } catch (InstantiationException e) {
     5             // TODO Auto-generated catch block
     6             e.printStackTrace();
     7         } catch (IllegalAccessException e) {
     8             // TODO Auto-generated catch block
     9             e.printStackTrace();
    10         }

    整个这个过程,就称之为反射。 

    二、通过反射获取类中的信息:

    1、通过反射获取类中的方法:

    getMethods()方法获取的是所有的public的函数,包括父类继承而来的

    getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限

    1 //要获取类的信息  首先要获取类的类类型
    2 Class c = obj.getClass();//传递的是哪个子类的对象  c就是该子类的类类型
    3 //getMethods()方法获取的是所有的public的函数,包括父类继承而来的
    4 //getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
    5 Method[] ms = c.getMethods();//c.getDeclaredMethods()

    然后遍历Method数组就可以得到里边的方法了。

    2、通过反射获取类中成员变量的信息:

    Field类封装了关于成员变量的操作
    getFields()方法获取的是所有的public的成员变量的信息
    getDeclaredFields获取的是该类自己声明的成员变量的信息

    1 Field[] fs = c.getFields();
    2 Field[] fs = c.getDeclaredFields();

    然后遍历Field数组就可以得到里边的成员变量了。

    3、通过反射获取构造函数的信息:

    构造函数也是对象
    java.lang. Constructor中封装了构造函数的信息
    getConstructors获取所有的public的构造函数
    getDeclaredConstructors得到所有的构造函数

    1 Constructor[] cs = c.getConstructors();
    2 Constructor[] cs = c.getDeclaredConstructors();

    然后遍历Constructor数组就可以得到里边的构造函数了。

  • 相关阅读:
    依赖注入
    ToDictionary() and ToList()
    Middleware详解
    仓储层的搭建
    Controller和View的交互
    Configuration配置信息管理
    开发工具
    60分钟Python快速学习(转)
    oracle PL/SQL(procedure language/SQL)程序设计之函数+过程+包(转)
    ssh无密码登陆(转)
  • 原文地址:https://www.cnblogs.com/CZDblog/p/5717986.html
Copyright © 2020-2023  润新知