浅谈 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做性能测 ...
随机推荐
- tcp_tw_recycle参数引发的系统问题
文章转载自: https://blog.csdn.net/zhuyiquan/article/details/68925707
- Elasticsearch:foreach 摄入处理器介绍---处理未知长度数组中的元素
转载自:https://blog.csdn.net/UbuntuTouch/article/details/108621206 foreach processor 用于处理未知长度数组中的元素.这个有 ...
- 《Spatial-Spectral T ransformer for Hyperspectral Image Classification》论文笔记
论文题目<Spatial-Spectral T ransformer for Hyperspectral Image Classification> 论文作者:Xin He 1 , Yus ...
- 《3-D Deep Learning Approach for Remote Sensing Image Classification》论文笔记
论文题目<3-D Deep Learning Approach for Remote Sensing Image Classification> 论文作者:Amina Ben Hamida ...
- python-函数-统计函数
#(1)amax(),amin() 作用:计算数组中的元素沿指定轴的最大值,最小值 import numpy as np x = np.random.randint(1,11,9).reshape(( ...
- NSIS限制程序运行次数和使用日期
#七八年前写着玩的小东西,实际用途不大,但对刚接触nsis的新手来说应该还有一些帮助,包括创建控件,获取系统时间等,与诸位共勉! !system '>blank set/p=MSCF<nu ...
- Educational Codeforces Round 106 (Rated for Div. 2)
就ac了2题... A题一开始题意模模糊糊的似懂非懂,然后自己按样例推出了题意,简单题很容易ac了.还是自己的英语水平太菜了.... B题根据0和1的位置关系能看出来,因为0不能在1后面, 所以有00 ...
- .NET 7 RC 2 发布,倒计时一个月发布正式版
微软2022-10-22 发布了 .NET 7 RC 2,下一站是.NET 7正式发布,就在下个月Net Conf 2022(11月8日)期间正式发布. 经过长达一年时间的开发,.NET 7 规划的所 ...
- KubeEdge 1.12版本发布,稳定性、安全性、可扩展性均带来大幅提升
摘要:2022年9月29日,KubeEdge发布1.12版本.新版本新增多个增强功能,在扩展性.稳定性.安全性上均有大幅提升. 本文分享自华为云社区<KubeEdge 1.12版本发布,稳定性. ...
- laravel 浏览器谷歌network返回报错html
laravel 在谷歌报错的时候会返回html,对于调试来说很不方便.原因是在于: 这里返回的格式是json,但是报错时候返回的是整个html所以 相对路径: app\Exceptions\Handl ...