浅谈 Java 和 Python 的反射
反射这个词我一直没搞懂,也不知道为什么需要反射,也不知道反射到底做了什么。所见所闻逐渐丰富之后,开始有点儿懂了。
先不管反射这个词是什么意思。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 的反射的更多相关文章
- 浅谈Java的反射机制和作用
浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...
- 浅谈java类集框架和数据结构(2)
继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...
- 浅谈Java代理二:Cglib动态代理-MethodInterceptor
浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈Java中的equals和==(转)
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的equals和==
浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 浅谈java性能分析
浅谈java性能分析,效能分析 在老师强烈的要求下做了效能分析,对上次写过的词频统计的程序进行分析以及改进. 对于效能分析:我个人很浅显的认为就是程序的运行效率,代码的执行效率等等. java做性能测 ...
随机推荐
- MySQL学习(2)---MySQL数据类型
ps:此随笔基于mysql 5.7.*版本. 补充: UNSIGNED:所有整数类型都可以有一个可选(非标准)UNSIGNED属性.无符号类型可用于在列中仅允许非负数存在,或者当开发者需要该列的较大数 ...
- Spring boot定义多个配置文件并自由切换
在resource目录下定义三个配置文件 (properties文件已被我注销,配置文件建议用yml,如果properties文件与yml文件同时存在,SpringBoot会优选加载propertie ...
- 自定义映射resultMap
resultMap处理字段和属性的映射关系 如果字段名与实体类中的属性名不一致,该如何处理映射关系? 第一种方法:为查询的字段设置别名,和属性名保持一致 下面是实体类中的属性名: private In ...
- 利用FastReport传递图片参数,在报表上展示签名信息
在一个项目中,客户要求对报表中的签名进行仿手写的签名处理,因此我们原先只是显示相关人员的姓名的地方,需要采用手写方式签名,我们的报表是利用FastReport处理的,在利用楷体处理的时候,开发展示倒是 ...
- Vue3 SFC 和 TSX 方式调用子组件中的函数
在开发中会遇到这样的需求:获取子组件的引用,并调用子组件中定义的方法.如封装了一个表单组件,在父组件中需要调用这个表单组件的引用,并调用这个表单组件的校验表单函数或重置表单函数.要实现这个功能,首先要 ...
- Redis—问题(1)
写在前面 Redis 是一种 NoSQL 数据库,包含多种数据结构.支持网络.基于内存.可选持久性的键值对存储数据库,在我们的日常开发中会经常使用 Redis 来解决许多问题,比如排行榜.消息队列系统 ...
- llinux下mysql建库、新建用户、用户授权、修改用户密码
1.创建新的数据库 1.1.root用户登录mysql mysql -u root -p 1.2.查看现有数据库 show databases; 1.3.新建数据库,此命名为cjc create ...
- ubuntu 安装anaconda3
ubuntu 安装anaconda3 官网:https://www.anaconda.com/ 下载:https://www.anaconda.com/products/individual#Down ...
- Pyhton基础部分:6、与用户交互、基础运算符
目录 一.python数据类型 1.布尔值bool 2.元组tuple 3.集合set 二.与用户交互 1.获取用户输入 2.输出内部信息 3.语言环境差异 三.格式化输入 1.代码实现 2.注意事项 ...
- Python标准库之 xml.etree.ElementTree
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. 每个element对象都具有以下属性: 1. tag:string对象,表示数据代表的种类. 2. attrib:dictiona ...