zoukankan      html  css  js  c++  java
  • java—反射

    java.lang.Class : 是反射的源头

    1、当我们创建了一个类,通过编译(javac.exe),生成对应的.class文件,之后使用java.exe加载(JVM的类加载器完成的)的.class文件。此.class文件加载到内存后,就是一个运行时类,存在缓存区。因此这个运行时类就是一个Class的实例对象!

    注意:每一个运行时类只加载一次

    2、有了Class的实力后,才可以进行一下操作

      1)*创建对应的运行时类对象

      2)获取对应的运行时类的完整结构(属相 方法 构造器 父类 所在的包 异常 注解...)

      3)*调用对应的运行时类的指定结构(属相 方法 构造器)

      4)应用:动态代理

    如何获取Class的实例(掌握3种)

      1)调用运行时类本身的.class属性 

        如 Class c1 = Person.class;

      2)通过运行时类的对象获取

          如:Person p =new Person 

            p.getClass();

      3)通过class的静态方法获取(会抛一个ClassNotFoundException异常)

          String className = "com.test.src.Person";

          Class.forName(className);

    newInstance();创建对应的运行时类对象

      该方法创建对应的运行时类对象,使用此方法,实际上就是调用了运行时类的空参的构造函数;

      因此要求:①对应的运行时类必须要有空参构造器;②构造器的权限修饰符的权限要足够

    反射是框架设计的灵魂

      框架:半成品软件,可以在框架的基础上进行软件的开发,简化编码

      反射: 将类的各个组成部分封装为其他对象,这就是反射

        好处:

          1、可以在程序运行中,操作这些对象。

          2、可以解耦,提高程序的扩张性。

        

        获取Class对象的方式:

          1.Class.forName("全类名"):将字节码文件加载进内存,返回Class对象

            多用于配置文件,将类名定义在配置文件中。读取文件,加载类

          2.类名.class: 通过类名的属性class获取

            多用于参数传递

          3.对象.getClass() :getClass()方法在Object类中定义着

            多用于对象的获取字节码的方式

          

    结论:
    同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

    * Class对象功能:
    * 获取功能:
    1. 获取成员变量们
    * Field[] getFields() :获取所有public修饰的成员变量
    * Field getField(String name) 获取指定名称的 public修饰的成员变量

    * Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
    * Field getDeclaredField(String name)
    2. 获取构造方法们
    * Constructor<?>[] getConstructors()
    * Constructor<T> getConstructor(类<?>... parameterTypes)

    * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
    * Constructor<?>[] getDeclaredConstructors()
    3. 获取成员方法们:
    * Method[] getMethods()
    * Method getMethod(String name, 类<?>... parameterTypes)

    * Method[] getDeclaredMethods()
    * Method getDeclaredMethod(String name, 类<?>... parameterTypes)

    4. 获取全类名
    * String getName()


    * Field:成员变量
    * 操作:
    1. 设置值
    * void set(Object obj, Object value)
    2. 获取值
    * get(Object obj)

    3. 忽略访问权限修饰符的安全检查
    * setAccessible(true):暴力反射

    * Constructor:构造方法
    * 创建对象:
    * T newInstance(Object... initargs)

    * 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法


    * Method:方法对象
    * 执行方法:
    * Object invoke(Object obj, Object... args)

    * 获取方法名称:
    * String getName:获取方法名

  • 相关阅读:
    Flask + vue 前后端分离的 二手书App
    Kafka 0.10.0.1 consumer get earliest partition offset from Kafka broker cluster
    Kafka topic Schema version mismatch error
    ORM的多表查询详述
    ORM多表操作之创建关联表及添加表记录
    ORM的单表操作
    Django的模板层简介
    Django的视图层简介
    Django中的路由配置简介
    Django简介及Django项目的创建详述
  • 原文地址:https://www.cnblogs.com/GOOGnine/p/12266949.html
Copyright © 2011-2022 走看看