zoukankan      html  css  js  c++  java
  • java反射机制学习笔记

    内容引用自:https://www.cnblogs.com/wkrbky/p/6201098.html

    https://www.cnblogs.com/xumBlog/p/8882489.html,本篇只为自我回顾学习。

    定义:

    程序在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取信息和调用对象方法的功能称之为反射机制。

    优缺点:

    优点就是可以实现动态创建对象和编译(在运行时创建和编译),体现出很大的灵活性。

    缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求这类操作总是慢于直接执行相同的操作

    反射机制就是专门 帮我们做那些重复的有规则的事情

    在反射中,使用一个类并不需要导入类的所在包,只要知道类的完整路径就可以知道该类中的所有信息。

    反射不需要有明确的类型对象,所有的对象都使用Object表示。可以直接用Object的与反射机制的混合调用类中的方法。

    使用反射的步骤:

      1.获取想要操作的类的Class对象;

           2. 调用Class类中的方法;

           3.使用反射API来操作这些信息。

    获取Class对象的方法:

           1.调用某个对象的getClass()方法;

           2.调用某个类的class属性来获取该类对应的Class对象;

           3.使用Class类中的forName()静态方法。

    在程序开发过程中,使用第二种方法比较多。但是在程序框架设计中,都是使用第三种方法,也就是反射机制用到的方法。

    创建对象:

    • 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器。
    • 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建 Class对象对应类的实例,通过这种方法可以选定构造方法创建实例

    构造函数:

     Constructor getConstructor(Class[] params) 所有的构造函数加参数类型指定具体的构造函数

        Constructor[] getConstructors() 所有的构造函数(包含父类的)

        Constructor getDeclaredConstructor(Class[] params) 自己定义的构造函数加参数类型指定具体的构造函数

        Constructor[] getDeclaredConstructors() 自己定义的构造函数

    如果要实例化一个对象,使用无参构造方法比有参构造方法简单的多,使用无参直接调用newInstance()方法,使用有参则先获取有参构造方法,

    再通过Constructor中的newInstance()方法,并用指定的初始化参数初始化改实例。很多框架中的底层代码默认都是使用无参构造方法来实例化对象

    所以在简单Java类开发中都要明确给出无参构造方法

    方法:

    获取类中的方法可以分为两大类,每个大类中又可以分为两小类,风别是:

    获取包括父类集成而来的方法:

    获取全部方法:public Method[] getMethods()  throws SecurityException 

    获取指定方法:public Method getMethod(String name,Class<?>... parameterTypes)  throws NoSuchMethodException, SecurityException 

    获取本类中定义的方法:

        获取全部方法:public Method[] getDeclaredMethods()  throws SecurityException   

        获取指定方法:  public Method getDeclaredMethod(String name, Class<?>... parameterTypes)  throws NoSuchMethodException, SecurityException 

    getModifiers():以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。

    getReturnType():返回一个 Class 对象,该对象描述了此Method 对象所表示的方法的正式返回类型。

    getName():以 String 形式返回此 Method 对象表示的方法名称。

    getParameterTypes():按照声明顺序返回 Class 对象的数组,这些对象描述了此Method 对象所表示的方法的形参类型。

    getExceptionTypes():返回 Class 对象的数组,这些对象描述了声明将此Method 对象表示的底层方法抛出的异常类型。

    调用(invoke):对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

    public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException

    该方法的英文名字是invoke,中文名称就叫“调用”,该方法在Method类中,Method类本身就代表一个方法,当Method类中的对象调用invoke方法时,

    就相当于调用了Method对象所代表的方法,方法里面传入对应的参数,实现动态调用方法。(不是很懂)

    属性:

    获取包括继承而来的属性:

    获取全部属性:public Field[] getFields()  throws SecurityException 

    获取指定属性:public Field getField(String name)  throws NoSuchFieldException,  SecurityException 

    获取本类定义的属性:

            获取全部属性:public Field[] getDeclaredFields()  throws SecurityException 

            获取指定的属性:public Field getDeclaredField(String name)  throws NoSuchFieldException,  SecurityException 

    在Field类中定义了进行属性调用的方法:

    设置属性内容:public void set(Object obj, Object value)  throws IllegalArgumentException, IllegalAccessException 

    获取属性类容:public Object get(Object obj)  throws IllegalArgumentException, IllegalAccessException 

    利用反射获取类中的属性,是不提倡使用的,因为违背了面向对象的封装特性。

    在Construction,Method,Field三个类中有一个共同的父类AccessibleObject,定义了取消封装的操作:setAccessible(Boolean flag)

    public void setAccessible(boolean flag)  throws SecurityException 

    该方法默认的是参数是false,表示反射的对象应该实施 Java 语言访问检查。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。

  • 相关阅读:
    数据流控制
    转:简单的Mysql主从复制设置
    转:CentOS---网络配置详解
    Linux-vim学习入门
    Linux图形界面与字符界面切换
    转:MySQL表名不区分大小写
    CentOS6.5_x86安装Mysql5.5.49
    Linux的环境变量设置和查看
    Linux防火墙的关闭和开启
    Linux command not found 问题解释
  • 原文地址:https://www.cnblogs.com/juanzila/p/11310768.html
Copyright © 2011-2022 走看看