• Java反射


    一、Java-Reflect专题

    1.Class类的使用

    2.方法的反射

    3.成员变量的反射

    4.构造函数的反射

    5.Java类加载机制

    |------------------------------------------基本反射简介----------------------------------------------|

        JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象

    能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

        JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言"。从这个观看,Perl,

    PythonRuby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection

    用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以

    加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields

    设值、或唤起其methods。

    跳转百度百科查看相关概念

    |-----------------------------------用于获得方法信息函数:------------------------------------------|

     Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

     Method[] getMethods() -- 获得类的所有公共方法

     Method getDeclaredMethod(String name, Class[] params) -使用特写的参数类型,获得类声明的命名的方法

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

    |-----------------------------------用于获得获取成员变量:------------------------------------------|

    Field[]  getFields()--方法获取的是所有的public的成员变量的信息

    Field[]  getDeclaredFields()--获取的是该类自己声明的成员变量的信息

    Field getField(String name) -- 获得命名的公共字段

    Field getDeclaredField(String name) -- 获得类声明的命名的字段

    |-----------------------------------用于获得构造函数的信息:------------------------------------------|

    Constructor[]  getConstructors()--获取所有的public的构造函数

    Constructor[]  getDeclaredConstructors()--得到自己声明的构造函数,推荐使用(与接入级别无关)

    Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数

    Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

    ==========================================================================

    1.什么是Calss类

        1):在面向对象的世界里,万事万物皆对象

                  Java语言中,静态成员、普通数据类型是不是对象昵?

                  类是谁的对象昵?

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

        2): 这个对象该怎么表示那?

                  There  is a class named Class   中文表示:现在有一个类,他的名字就是Class

    直接上大栗子分析:

    2.动态加载类
        1.Class.forName("类的全称");
        2.不仅表示了类的类类型,还代表了动态加载类
        3.请大家区分编译、运行
        4.编译时刻加载类是静态加载类、运行时刻加载类是动态加载类
    先前小栗子:
    main:

    Word类

    解析:在上述 main中,我们去创建了两个类的实例:假设现在没有还没有Word类的时候:
                我们去运行肯定会有四个错误:找不到两个类和两个类的方法。
                那么我现在去创建一个Word类,就是上述的Word类。在运行的会怎样那。
                运行结果两个错,找不到Office类和方法。
                现在可以看出来一个问题:就是我有Word类,但是程序还不能运行。导致我不能使用任何一个类。
                这就是静态加载类:在编译时刻就需要加载所有的可能使用到的类。
                那么有什么办法能做到:我想用那个类的时候在告诉我,那个类能用,还是不能用。
                解决方案:静态加载类
     
    看栗子:
    首先定义一个:动态加载类----》定义两个功能类------》定义一个功能标准接口分别让两个类实现。
    动态加载类:

    定义一个标准接口:

    定义两个类实现标准接口:方便动态加载

     
    3.java获取方法信息
    基本的数据类型:
    例如:
    Class  c1=int.class;  //int的类类型   ||  Class  c2=String.class; //String类的类类型
    Class  c3=double.class;   ||  Class  c4=Double.class;  两者不同,后表示Double类的类类型
    Class  c5=void.class;
    void关键字 都存在类类型
    3-1:Class类的基本API操作
            打印类的信息,包括类的成员函数、成员变量

     

    运行结果:

    4:java获取成员变量构造函数信息
        成员变量也是对象:java.lang.reflect.Field
        Field类封装了关于成员变量的操作
    4-1:获取成员变量:

    运行如下:

    4-1:获取构造函数信息

    运行如下:

    五:java方法反射的基本操作
            1)如何获取某个方法
                 方法的名称和方法的参数列表才能唯一决定某个方法
            2)方法反射的操作
                  methood.invoke(对象,参数列表)
    小栗子:

    7.泛型集合反射
        1.看这样一个问题:
        假设我定义一个泛型集合:
            ArrayList<String>  list = new  ArrayList<String>();
        添加一个信息:
            list.add("a");
        2.如果向这个集合添加一个数值可以添加吗?正常情况下肯定不行。
          那么有什么办法可以实现添加那?答使用集合反射
          集合反射又是什么鬼那?
          集合反射就是,等待集合编译完成后,在进行集合操作,就是绕过编译期间。
    接下来我们来看个,大栗子,你就懂了

  • 相关阅读:
    OK335xS 网络连接打印信息 hacking
    OK335xS mac address hacking
    buildroot linux filesystem 初探
    busybox filesystem matrix-gui-2.0 undefined function json_encode()
    RPi 2B Documentation
    RPi 2B Raspbian SD卡内部架构
    Error building results for action sayHello in namespace /inteceptor
    linux 失败无连接 检查电缆吗
    Struts2
    struts2加入自定义的actionValidatorManager实现类
  • 原文地址:https://www.cnblogs.com/3020815dzq/p/8952415.html
Copyright © 2020-2023  润新知