精华内容
下载资源
问答
  • 通过wiki百科可知: 在计算机学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为一种能力。[1]用比喻来说,反射就是程序在运行时候能够“观察”并且修改...

    背景

    在学习java的动态代理的时候用到了反射机制,那我们来对反射机制深入了解一下

    权威指南

    通过wiki百科可知: 在计算机学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。[1]用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。

    在类型检测严格的面向对象的编程语言如Java中,一般需要在编译期间对程序中需要调用的对象的具体类型、接口、字段和方法的合法性进行检查。反射技术则允许将对需要调用的对象的信息检查工作从编译期间推迟到运行期间再现场执行。这样一来,可以在编译期间先不明确目标对象的接口名称、字段(fields,即对象的成员变量)、可用方法,然后在运行根据目标对象自身的信息决定如何处理。它还允许根据判断结果进行实例化新对象和相关方法的调用。

    个人理解

    在一般情况下, 文件会在编译期转换为jvm可执行的字节码 .class 文件,这个执行过程是在类加载的时候执行的,但是jvm在类加载对这一过程并不严格,所以说这一加载步骤可以放在运行期执行。利用这一特性也就有了反射机制。

    反射机制很重要的一点就是“运行时”,其使得我们可以在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。换句话说,Java 程序可以加载一个运行时才得知名称的 .class 文件,然后获悉其完整构造,并生成其对象实体、或对其 fields(变量)设值、或调用其 methods(方法)。

    我感觉还有有点“干" ,反射也是创建对象的一种方式,使用new 关键字可以创建一个对象,那是因为我们知道他是个什么对象,而反射反射的意思是,我并不知道这个对象是什么,但是我可以通过class.forName()读取到这个对象,然后也可以读取到他的Method ,interface ,Construct等,还可以通过Invoke()方法进行赋值等操作。

    java中反射的使用

    1. 写一个demo
    package reflect;
    
    import java.lang.reflect.Constructor;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    /**
     * @Author:yuanxindong
     * @Date:2020/5/1113:23
     */
    public class Person extends Huaman{
    
        private  String name;
        private  String gender;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    
        public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
            //通过classLoad 获取类的 Class 对象实例。
            Class c = Class.forName("reflect.Person");
            //根据Class对象实例获取 Constructor 对象
            Method setName = c.getMethod("setName", String.class);
            //根据 Class 对象实例获取 Constructor 对象
            Constructor constructor = c.getConstructor();
            //使用Constructor对象的newInstance 方法获取反射类对象
            Object o = constructor.newInstance();
            //使用invoke方法调用创建实例对象的方法。
            setName.invoke(o,"yuanxindong");
            //查看调用是否成功
            System.out.println(o.toString());
    
        }
    }
    
    1. 下面是执行结果。
      在这里插入图片描述
      上面的代码就可以看出来java中的反射基础使用,但是一个new关键字和直接一个set方法就能解决的问题为什么,非要使用反射呢?
    • 先明确一点,反射直接根据文件的地址获取class,将其加载到内存中 。不需要在刚开始进行编译,直接在运行期间进行读取加载。 这就是他的优势,我们使用new关键字这个类必须是被预先被加载过的,我们可以大概看一forName()的源码:
      在这里插入图片描述
      其中的classLoad也就是父类加载器,我们在这里就先证明他就是去加载class对象了。(具体不在这里细究)。如果是使用new 关键字的话那么这个对象前提得是被解析过的(加载,验证,初始化和卸载这五个阶段顺序是确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段却不一定:他在某些情况下可以在初始化之后再开始《深入理解java虚拟机》)
    • 再者就是Java反射现在应用的场景,
      1. JDBC的数据库连接
      2. Spring 框架的使用
        1. 将程序内所有 XML 或 Properties
        2. 配置文件加载入内存中
          Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息
        3. 使用反射机制,根据这个字符串获得某个类的Class实例
      3. 再在这里扯一下Spring为什么这么做呢?他的意思就是遵循“好莱坞规则”我不去找你,而是我来找你。也就是IOC和DI的意思,将对象创建好注入到IOC容器再使用依赖注入的方式主动注入到对应的类中。

    总结

    说了上面那么一大堆,也不知道吧反射机制说清楚没有,
    java的反射的目的就是在运行时期动态加载class对象实例化对象,主要使用的方法有:

    Class.forName();
    class.getMethod();
    class.getConstructor();
    constructor.newInstance();
    method.invoke(Object,value);
    

    思考

    我们在使用携程的文件配置系统 APollo的时候,他是如何达到更改配置后达到热更新的?是否基础原理也是用到了反射??

    展开全文
  • Java反射机制是什么

    2020-09-05 20:39:08
    编译期是指把源码交给编译器编译成计算机可以执行文件过程。在 Java 中也就是把 Java 代码编成 class 文件过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作...

    Java反射机制是Java语言的一个重要特性。在学习Java反射机制前,大家应该先了解两个概念,编译期和运行期。

    编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。

    运行期是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

    Java 反射机制在服务器程序和中间件程序中得到了广泛运用。在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法。此外,在 ORM 中间件的实现中,运用 Java 反射机制可以读取任意一个 JavaBean 的所有属性,或者给这些属性赋值。


    Java 反射机制主要提供了以下功能,这些功能都位于java.lang.reflect包。

    • 在运行时判断任意一个对象所属的类。
    • 在运行时构造任意一个类的对象。
    • 在运行时判断任意一个类所具有的成员变量和方法。
    • 在运行时调用任意一个对象的方法。
    • 生成动态代理。

    要想知道一个类的属性和方法,必须先获取到该类的字节码文件对象。获取类的信息时,使用的就是 Class 类中的方法。所以先要获取到每一个字节码文件(.class)对应的 Class 类型的对象.

    众所周知,所有 Java 类均继承了 Object 类,在 Object 类中定义了一个 getClass() 方法,该方法返回同一个类型为 Class 的对象。例如,下面的示例代码:

    Class labelCls = label1.getClass(); // label1为 JLabel 类的对象

    利用 Class 类的对象 labelCls 可以访问 labelCls 对象的描述信息、JLabel 类的信息以及基类 Object 的信息。表 1 列出了通过反射可以访问的信息。

    表 1 反射可访问的常用信息
    类型 访问方法 返回值类型 说明
    包路径 getPackage() Package 对象 获取该类的存放路径
    类名称 getName() String 对象 获取该类的名称
    继承类 getSuperclass() Class 对象 获取该类继承的类
    实现接口 getlnterfaces() Class 型数组 获取该类实现的所有接口
    构造方法 getConstructors() Constructor 型数组 获取所有权限为 public 的构造方法
    getDeclaredContruectors() Constructor 对象 获取当前对象的所有构造方法
    方法 getMethods() Methods 型数组 获取所有权限为 public 的方法
    getDeclaredMethods() Methods 对象 获取当前对象的所有方法
    成员变量 getFields() Field 型数组 获取所有权限为 public 的成员变量
    getDeclareFileds() Field 对象 获取当前对象的所有成员变量
    内部类 getClasses() Class 型数组 获取所有权限为 public 的内部类
    getDeclaredClasses() Class 型数组 获取所有内部类
    内部类的声明类 getDeclaringClass() Class 对象 如果该类为内部类,则返回它的成员类,否则返回 null


    如表 1 所示,在调用 getFields() 和 getMethods() 方法时将会依次获取权限为 public 的字段和变量,然后将包含从超类中继承到的成员变量和方法。而通过 getDeclareFields() 和 getDeclareMethod() 只是获取在本类中定义的成员变量和方法。

    Java 反射机制的优缺点

    优点:

    • 能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。
    • 与 Java 动态编译相结合,可以实现无比强大的功能。
    • 对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。

    缺点:

    • 反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
    • 反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题。

    Java 反射机制在一般的 Java 应用开发中很少使用,即便是 Java EE 阶段也很少使用。

    展开全文
  •  由公共语言运行库环境执行代码,而不是直接由操作系统执行代码,托管代码应用程序可以获得公共语言运行库CLR服务,例如自动垃圾回收,运行库类型检查,安全支持等服务,这些服务帮助提供独立于平台和语言...
            托管代码
    

      托管代码就是基于.NET元数据格式的代码,运行于.NET平台之上,所有的与操作系统的交换由.NET平台来完成,就像是把这些功能委托给.NET,所以称之为托管代码

      由公共语言运行库环境执行的代码,而不是直接由操作系统执行的代码,托管代码应用程序可以获得公共语言运行库CLR的服务,例如自动垃圾回收,运行库类型检查,安全支持等服务,这些服务帮助提供独立于平台和语言的,统一的托管代码应用程序行为

      托管代码不必再担心内存分配,类型安全,公共语言运行时环境管理目标的执行,使用C#或者VB.NET等这些语言编写的代码被称为托管代码,托管代码总是汇编成一个中间语言(MSIL 简称IL)
      这些编译器使用.NET框架把托管代码编译成一个中间语言和产生必要的元数据和信息

      托管代码就是Visual Basic .NET和C#编译器编译出来的代码,编译器把代码编译成中间语言(MSIL 简称IL),而不是能直接在你的电脑上运行的机器码,中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据,这个程序集是.NET世界中的一个一站式购物部署单元,你可以拷贝这个程序集到另一台服务器上部署它--通常来说,这个拷贝的动作就是部署流程中唯一的一个操作,托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性,当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机器码,然后会把编译好的机器码缓存起来,以备下次调用(这就是即时编译)

    每天学习一点点,每天进步一点点 用文字记录工作,用文字记录人生
    展开全文
  • 阅读目录  一:托管代码 ... 由公共语言运行库环境执行代码,而不是直接由操作系统执行代码,托管代码应用程序可以获得公共语言运行库CLR服务,例如自动垃圾回收,运行库类型检查,安全支持等服务...

      阅读目录

      一:托管代码

      一:托管代码

      . 托管代码就是基于.NET元数据格式的代码,运行于.NET平台之上,所有的与操作系统的交换由.NET平台来完成,就像是把这些功能委托给.NET,所以称之为托管代码

      . 由公共语言运行库环境执行的代码,而不是直接由操作系统执行的代码,托管代码应用程序可以获得公共语言运行库CLR的服务,例如自动垃圾回收,运行库类型检查,安全支持等服务,这些服务帮助提供独立于平台和语言的,统一的托管代码应用程序行为

      . 托管代码不必再担心内存分配,类型安全,公共语言运行时环境管理目标的执行,使用C#或者VB.NET等这些语言编写的代码被称为托管代码,托管代码总是汇编成一个中间语言(MSIL 简称IL)
      . 这些编译器使用.NET框架把托管代码编译成一个中间语言和产生必要的元数据和信息

      . 托管代码就是Visual Basic .NET和C#编译器编译出来的代码,编译器把代码编译成中间语言(MSIL 简称IL),而不是能直接在你的电脑上运行的机器码,中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据,这个程序集是.NET世界中的一个一站式购物部署单元,你可以拷贝这个程序集到另一台服务器上部署它,通常来说,这个拷贝的动作就是部署流程中唯一的一个操作,托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性,当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机器码,然后会把编译好的机器码缓存起来,以备下次调用(这就是即时编译)

    展开全文
  • python自省机制

    千次阅读 2020-06-22 22:14:08
    检查某些事物以确定它是什么,它能做什么,这样,给开发人员带来了极大灵活性和控制力。 具体来说,就是OPP(面向对象)语言在程序运行时,能够知道对象类型,部分语言还能够知道对象所拥有属性。 自省机制,...
  • 了解java 反射机制

    2021-04-25 21:43:05
    Java反射(reflection)机制是指在程序运行状态中,可以构造任意一个类对象,可以了解任意一个对象所属类,可以了解任意一个类成员变量和方法,可以调用任意一个对象属性和方法。这种动态获取程序信息...
  • C++RTTI机制

    2018-11-11 13:17:32
    RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。 1.1 RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系...
  • volatile关键字 保证了可见性和 有序性,但不...原子操作(指令步骤层面):是指不会被线程调度机制打断操作。这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch。 Java 原子操作:参考https:...
  • 初探GO中反射机制

    2020-12-24 21:59:33
    Go 语言提供了一种机制在运行时更新变量和检查它们值、调用它们方法,但是在编译时并不知道这些变量具体类型,这称为反射机制。 10.2 反射作用 1.在编写不定传参类型函数时候,或传入类型过多时 典型应用...
  • Python自省机制

    2019-09-27 21:42:18
    在计算机编程中,自省是这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大灵活性和控制力。 说更简单直白一点:自省就是面向对象语言所写程序在运行时,能够知道...
  • 那么我就在想这个内省机制是什么呢? WiKi上解释是: 在计算机科学中,内省是计算机程序在运行时(Run time)检查对象(Object)类型一种能力, 通常也可以称作运行时类型检查。 不应该将内省和反射混淆...
  • C++中RTTI机制解析

    2020-05-12 13:58:02
    RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的产生 为什么会出现RTTI这一机制,这和C++语言本身有关系。和...
  • 当第一次碰到 Spark,尤其是 Checkpoint 时候难免有点一脸懵逼,不禁要问,Checkpoint 到底是什么。所以,当我们在说 Checkpoint 时候,我们到底是什么? 网上找到一篇文章,说到 Checkpoint,大概意思是检查...
  • 反射机制

    2020-12-25 09:59:26
    Go 语言提供了一种机制在运行时更新变量和检查它们值、调用它们方法,但是在编译时并不知道这些变量具体类型,这称为反射机制。 10.2 反射作用 1.在编写不定传参类型函数时候,或传入类型过多时 典型应用...
  • 关于python自省机制

    2019-04-19 21:16:30
    在计算机编程中,自省是这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大灵活性和控制力。 说更简单直白一点:自省就是面向对象语言所写程序在运行时,能够知道...
  • 电脑程序设计中,自我检查就是这种能力:通过检查某些东西来判断它是什么,它知道什么,它能做什么。自我检查为程序员提供了很大灵活性和控制能力。 更简单直白一点:自省是面向对象语言编写程序在运行时,...
  •  * 所谓双重检查加锁机制指的是:并不是每次进入getInstance方法都需要同步,  * 而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,  * 这是第一重检查。进入同步块后,再次...
  • Gamebryo 引擎RITI机制

    2016-11-19 22:38:54
     通过运行时类型识别(RTTI)(Run-Time Type Identification),程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型,在C++中,RITI最大的用处通过虚函数来实现多态。不过有些时候我们
  • 异常机制

    2020-02-28 20:56:25
    概述 常见异常 异常处理 其他问题 参考   概述 如果使用异常,就不必在方法调用处进行检查,异常机制将保证能够捕获这个错误,并且,只需在一个地方处理错误...异常情形是指阻止当前方法或者作用域继续执行...
  • Go 反射机制

    2020-12-25 00:12:28
    Go 语言提供了一种机制在运行时更新变量和检查它们值、调用它们方法,但是在编译时并不知道这些变量具体类型,这称为反射机制。 10.2 反射作用 1.在编写不定传参类型函数时候,或传入类型过多时 典型应用...
  • redis采用的是定期删除+惰性删除混合策略,至于为什么不单纯使用定时删除,那是因为用一个定时器监视key,过期自动删除,虽然实现了内存及时释放,但是这样的操作十分消耗CPU资源,高并发的情况下,CPU主要用来处理...
  • Java 反射机制

    2021-04-23 10:04:44
    文章目录一、Java反射机制是什么?二、Java反射机制API1.java.lang.Class 类2.java.lang.reflect 包三、Java通过反射访问构造方法总结 一、Java反射机制是什么? 编译期和运行期: 编译期是把源码交给编译器编译...
  • Java异常机制

    2021-03-01 13:39:50
    异常机制 Exception ...检查性异常:最具代表的检查性异常用户错误或问题引起异常,这程序员无法预见。例如打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单忽略。测试岗

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 246
精华内容 98
关键字:

检查机制指的是什么