反射这个词我一直没搞懂,也不知道为什么需要反射,也不知道反射到底做了什么。所见所闻逐渐丰富之后,开始有点儿懂了。

先不管反射这个词是什么意思。Java 里面有反射,Python 里面也有反射,但是不太有人强调 Python 里面的反射,可能是因为 Python 是解释的语言,天然的容易获得运行时的类型信息。

C 语言是最贴近硬件的编程语言。C 语言编译到汇编以后,汇编只有指令,寄存器。根本不管什么 int, float, struct date。从汇编我们只知道用哪个寄存器,往哪个地址写东西,从哪个地址读东西,一次读也就最多读一个寄存器的大小,具体一点大概是64位或者32位。C 语言的程序里面的变量在运行的时候不知道他是什么类型,只在编译的时候知道一个变量占多少个字节。

Java 和 Python 都是有一个 VM 用来运行从源码编译到的字节码。Python 的 OOP 世界一切都是对象,变量,字面量是对象,类型也是对象。我们可以通过obj.attr的方式访问对象的属性,对于这种动态解释的语言来说,方法也是属性。在 Python 可以轻松获得一个对象的有关信息,包括它的类型。使用type()函数可以知道一个对象的类型。

>>> str
<class 'str'>
>>> type(str)
<class 'type'>
>>> type
<class 'type'>

一切皆对象,类也是对象,类是<class 'type'>的对象。str 这个类是 <class 'str'>,而 str 这个类的类是 type。好吧,很绕了。声明一个类就是声明了一种新的类型,类型也是对象,类型是 type 的对象。那么如果还要追究 type 是谁的对象,那目前我只能说就像盘古开天辟地,混沌初始一样,自这个世界开始,混沌就是这个世界开始的起点(如果你相信的话)。type 由 VM 建立,而 VM 就是我们造的混沌,我们也是盘古直接将 VM 需要的东西都建立了起来。

实际上,Python 的类的机制完全可以用 Python 的函数来实现1。用 class MyClass 这种语法声明一个类,完全可以当做是一个函数,加载/构造这个类的时候这个函数体被执行,然后函数体的本地变量都变成了这个新类方法和类的属性。这个类是通过type()构造的。而所有的类型的属性都可以从对象获得。

>>> str
<class 'str'>
>>> str.__name__
'str'
>>> 'Hello'.__class__
<class 'str'>
>>>

Python 的每个模块只会被 evaluate 一次。import 一个模块的时候模块内的代码被执行,模块内的 class 里的语句也被执行,每个 class 都是被 type 实例化出来的类型。

在 Python 的世界获取对象的类型特别简单,都在对象的属性里面了。不知不觉就已经用到了反射了,从一个对象获得它的类型,这就是反射做的事情。Python 的类的加载是执行类的定义,所有的类都是 type 的实例。而 Java 也有类似之处。

Java 所有的类都是 Class 这个类的实例,而所有的对象都有一个 class 属性,可以获取对象的类。而 Java 是加载完必要的类之后,用到类的时候才去装载类。Python 是 import 一个类,或者类被 type 制造出来的时候完成类的装载。装载或者加载一个类,制造出来类型的时候,类的代码被执行。

通过反射可以在运行时刻知道对象的类型信息。Java 可通过Class.forName()去加载一个类,Python 可以通过 import 类来加载类,加载类的时候类的代码被执行。加载完了,就有了新的类型。所以 MySQL 的 JDBC,可以用 Class.forName("com.mysql.cj.jdbc.Driver")加载类,执行类的代码。

浅谈 Java 和 Python 的反射的更多相关文章

  1. 浅谈Java的反射机制和作用

    浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...

  2. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  3. 浅谈Java代理二:Cglib动态代理-MethodInterceptor

    浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...

  4. 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance

    浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...

  5. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  6. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  7. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

  8. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  9. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  10. 浅谈java性能分析

    浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...

随机推荐

  1. 安装jumpserver 2.1.2版本遇到的坑

    官方文档地址:https://docs.jumpserver.org/zh/master/install/step_by_step/ Jumpserver 对外需要开放 80 和 2222 端口,如果 ...

  2. 分享一个Vue实现图片水平瀑布流的插件

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.需求来源 今天碰到了一个需求,需要在页面里,用水平瀑布流的方式,将一些图片进行加载,这让我突然想起我很久以前写的一篇文章<JS两 ...

  3. 【Wine使用经验分享】Wine字体显示问题处理

    字体不显示/字体为□ 首先尝试下载simsun字体到/usr/share/fonts (simsun.ttf simsun.ttc) 在新版本wine上,差不多就能解决问题. 如果还不行,就从网上下载 ...

  4. jq修改多个css样式

    $("#xxx").css({"属性名称": "属性值", "属性名称": "属性值" });

  5. Leetcode链表

    Leetcode链表 一.闲聊 边学边刷的--慢慢写慢慢更 二.题目 1.移除链表元素 题干: 思路: 删除链表节点,就多了一个判断等值. 由于是单向链表,所以要删除节点时要找到目标节点的上一个节点, ...

  6. 关于aws cli命令的exit/return code分析

    最近总是收到一个备份脚本的失败邮件,脚本是之前同事写的,没有加入任何有调试信息,及有用的日志 于是去分析 ,脚本中有一条 aws s3 sync $srclocal  $dsts3 命令,然后根据这条 ...

  7. PHP全栈开发(八):CSS Ⅳ 文本格式及字体

    文本系列属性主要是设置文本格式的,例如.... 颜色 body {color:red;} h1 {color:#00ff00;} p.ex {color:rgb(0,0,255); 可以设置文本的居中 ...

  8. mysql安装教程-window操作系统

    1.下载安装包(官网下载) 直达链接:https://dev.mysql.com/downloads/mysql/ 下载后放到指定目录下解压即可(给电脑新手忠告:注意不要放在C盘,养成好习惯,放C盘多 ...

  9. PHP配置负载均衡

    我项目是用宝塔面板.所以这次用宝塔面板演示. 环境: LNMP 代码:2套.2套代码除了配置其他都是一样 域名:1个.2级域名.其实一级二级都没关系 /************************ ...

  10. web share api 分享

    概述 Navigator.share()  方法通过调用本机的共享机制作为 Web Share API 的一部分.如果不支持 Web Share API,则此方法为 undefined. 此项功能仅在 ...