zoukankan      html  css  js  c++  java
  • 反射

    反射:
    在运行时,可以获得任意一个类或对象的所有方法(private的也能获取(待定))和属性(就是三种方法从class文件(字节码文件)中获取文件中的各种关于类的信息,然后可以用来创建对象
    通过对应类的字节码文件获得类的方法和属性(作用:比如可以通过某些方法,匹配相应的信息)
    获得CLass对象)
    应用场景:
    学习框架,框架的底层会大量使用反射.SSH
    调用配置文件
    前提:
    获取类的对象(Class(字节码)对象)
    获取方式(3种):
    通过Object的getClass方法,必须要有对象,返回值是Class对象
    目标类的class属性,返回值是Class对象
    Class类的forName方法,返回值时Class对象(推荐使用)

    CLass:
     Constructor<?>[] getConstructors()  获取所有的构造方法(public修饰的)
     Constructor<T> getConstructor(Class<?>... parameterTypes)
     获取有参或者无参的构造方法

    Constructor:
    T newInstance(Object... initargs)  
    获取Constructor的实例,实例的构造方法参数与Constructor的参数相同

    方式二:
     T newInstance()
     使用CLass的方法创建无参的对象

    注:
    用getConstructor方法,里面填的参数是对应属性类型的class属性,而不是具体值或者直接的数据类型,因为里面传的参数是Class<?>... parameterTypes,是数据类型的class属性。

    通过反射获得成员变量
    Class:
     Field getField(String name) 获取公共的属性(自动匹配参数的值,如果有就返回指定的属性)
     Field[] getFields()  获取所有公共的属性
     Field getDeclaredField(String name) 获取属性(包括私有,自动匹配参数的值,如果有就返回指定的属性)
     Field[] getDeclaredFields()  获取所有的属性(包括私有)
    Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  获取构造方法(包括私有)
    Filed:

    void set(Object obj, Object value)  对获取的Field进行设置属性值
    Object get(Object obj)  获取指定field的属性值

    AccessibleObject:Field的基类:暴力访问
     void setAccessible(boolean flag) 如果flag为true,就取消Java设置的访问权限
     
    Method getMethod(String name, Class<?>... parameterTypes)  
    获取方法,传入方法名,如果有参数就传入参数类型的字节码属性
    Method[] getMethods()  


    JavaBean:
    用于封装数据,就是类= =

    BeanUtils
     static void setProperty(Object bean, String name, Object value)
     static String getProperty(Object bean, String name)
    这两个方法底层是JavaBean中的set和get方法
     static void populate(Object bean, Map properties)
    将map中的映射关系传到JavaBean中

    如果赋的值是由父类继承过来的,还能用这个方法吗


    反射的好处:
    1.三种方式,class,getClass,forName,可以在不知道JavaBean的类型的情况下获取其中的数据,也可以创建对象获取数据,也可以不知道类型
    2.可以在不知道属性类型的情况下设置或者获取属性值

    Declared方法和普通方法的区别:
    普通的方法只能返回被public修饰的方法,但是可以返回所有继承来的父类的方法
    Declared方法可以返回所有类型的方法,但是不能返回继承来的方法

    单个声明或者说声明特定值需要写参数,如果返回的是数组就不需要

  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/Yuanpp/p/8445761.html
Copyright © 2011-2022 走看看