精华内容
下载资源
问答
  • 今天来说说编程语言中...动态语言目前非常具有活力如PHP、Ruby、Python 都属于动态语言,而C、C++、Java等语言则不属于动态语言。这个解释很抽象,其实动态语言是相对静态语言而言的,静态语言的特点在程序执行前...

    今天来说说编程语言中的动态类型语言与鸭子类型,维基百科对动态语言的定义:

    动态编程语言是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力如PHP、Ruby、Python 都属于动态语言,而C、C++、Java等语言则不属于动态语言。

    这个解释很抽象,其实动态语言是相对静态语言而言的,静态语言的特点是在程序执行前,代码编译时从代码中就可以知道一切,比如变量的类型,方法的返回值类型:

    String s = "hello"

    s = "world"

    s = 1 // 编译时就会报错

    在静态语言中,变量有类型信息,它是一块内存区域,静态语言的优点是代码结构非常规范,便于调试,但有时显得啰嗦。而动态语言只有等到程序运行时才知道一切,变量(严格来说叫名字,就像人的名字一样)不需要指定类型,变量本身没有任何类型信息,类型信息在对象身上,对象是什么类型,必须等到程序运行时才知道,动态类型语言的优点在于方便阅读,不需要写很多类型相关的代码;缺点是不方便调试,命名不规范时会造成读不懂,不利于理解等。

    s = "hello"

    s = "world"

    s = 1 # 可以给变量随意赋值,无论是什么类型都可以

    鸭子类型

    动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。

    如果你学的是Java或者C++等静态语言,可能对鸭子类型的理解没那么深刻,因为静态语言中对象的特性取决于其父类。而动态语言则不一样,比如迭代器,任何实现了 __iter__ 和 __next__方法的对象都可称之为迭代器,但对象本身是什么类型不受限制,可以自定义为任何类

    # python3

    class Foo:

    def __iter__(self):

    pass

    def __next__(self):

    pass

    from collections import Iterable

    from collections import Iterator

    print(isinstance(Foo(), Iterable)) # True

    print(isinstance(Foo(), Iterator)) # True

    我们并不需要继承 Iterator 就可以实现迭代器的功能。当有一函数希望接收的参数是 Iterator 类型时,但是我们传递的是 Foo 的实例对象,其实也没问题,换成是Java等静态语言,就必须传递 Iterator或者是它的子类。鸭子类型通常得益于"不"测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用,这既是优点也是缺点,缺点是需要通过文档才能知道参数类型,为了弥补这方面的不足,Python3.6引入了类型信息,定义变量的时候可以指定类型,例如:

    def greeting(name: str) -> str:

    return 'Hello ' + name

    该函数表示接收str类型的参数,并返回str类型的值

    有问题可以扫描二维码和我交流

    关注公众号「Python之禅」,回复「1024」免费获取Python资源

    weixin.jpg

    展开全文
  • Java本身一种面向对象语言Java文件在运行的过程中先经过javac编译出字节码文件.class文件。 之后通过Java虚拟机(JVM)内嵌的解释器将字节码文件转成机器码(可以在电脑上运行的代码)。 但是在我们常用的JVM中...

    其实这个问题问的有些笼统,首先对Java的运行机制进行分析。
    Java本身是一种面向对象语言。Java文件在运行的过程中先经过javac编译出字节码文件.class文件。
    之后通过Java虚拟机(JVM)内嵌的解释器将字节码文件转成机器码(可以在电脑上运行的代码)。
    但是在我们常用的JVM中我们所使用的Oracle JDK的HotSpot JVM中提供了JIT(Just-in-time)编译器,它的作用是能够在运行时动态的将热点代码编译成机器码。
    这种情况下就属于编译执行,而不是解释执行了。

    展开全文
  • 接口实际上为拥有它们的静态语言(如Java)增加了一定程度的动态语言灵活性。它们提供了一种查询对象的方法,该对象实现了契约运行时这个概念很好地移植到动态语言中。当然,这取决于您对“动态”一词的定义,甚至包括...

    接口实际上为拥有它们的静态语言(如Java)增加了一定程度的动态语言灵活性。它们提供了一种查询对象的方法,该对象实现了契约

    运行时

    这个概念很好地移植到动态语言中。当然,这取决于您对“动态”一词的定义,甚至包括Objective-C,它在Cocoa中非常广泛地使用协议。

    在鲁比我可能会问

    object.respond_to? :sync

    所以,是的,它有一个名为“sync”的方法,不管这是什么意思。

    在Objective-C中,我可能会问类似的问题,即“这个看起来/走路/嘎嘎叫像是同步的东西吗?”:

    [myObject respondsToSelector:@selector(sync)]

    更好的是,以一些冗长的内容为代价,我可以问一些更具体的问题,例如,“这个看起来/走路/嘎嘎叫像是与MobileMe同步的东西吗?”:

    [myObject respondsToSelector:@selector(sync:withMobileMeAccount:)]

    那是鸭子在物种层次上的分类。

    但要问一个对象是否有希望实现与MobileMe的同步。。。

    [receiver conformsToProtocol:@protocol(MobileMeSynchronization)]

    当然,您可以通过检查一系列选择器的存在来实现协议,这些选择器是您考虑的协议/duck的定义,并且它们是否足够具体。在哪一点上,这个协议仅仅是一大块丑陋回应的缩写?查询和一些非常有用的语法糖供编译器/IDE使用。

    对于更复杂的库或类层次结构来说,它无疑比大多数应用程序代码更有用,但我认为这个概念在任何语言中都是有用的。

    另外,还有人提到了混音。RubyMixins是一种共享代码的方式——例如,它们与类的实现相关。接口/协议是关于类或对象的接口。它们实际上可以相互补充。您可能有一个指定行为的接口,以及一个或多个帮助对象

    实施

    当然,我想不出任何一种语言都有明显的一级语言特征。在那些有mixin的系统中,包括mixin通常意味着它实现的接口。

    展开全文
  • java反射

    2019-11-26 19:56:32
    java反射(概念) 反射的一些概述: —什么是反射机制: ​ 反射机制是java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言 –什么是动态语言 ​ 是指程序在运行时可以改变其...–java是动态语言吗 ...

    java反射(概念)

    反射的一些概述:

    —什么是反射机制:

    ​ 反射机制是java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言

    –什么是动态语言

    ​ 是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的javaScript就是动态语言,除此之外Ruby,python等也属于动态语言,而c、c++则不属于动态语言。

    –java是动态语言吗

    ​ 从动态语言能在运行时改变程序结构或则变量上看,Java和c、c++一样都不属于动态语言。但是java却又有一个非常突出的与动态相关的机制:反射机制。java通过反射机制,可以在程序运行时加载,探知和使用编译期间完全未知的类,并且可以生成相关类对象实例,从而可以调用其方法或则改变某个属性值。所有Java也可以算得上是一个半动态的语言

    –什么是反射机制

    ​ 在java中的反射机制是指在运行状态中,对任意一个类都能知道这个类所有的属性和方法;并且对任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为java语言的反射机制。

    一句话概述:反射就是把java类中的各种成分映射成一个个的Java对象

    反射的应用场合
    	在编译时根本无法知道该对象或类可能属于哪些类,程序只依靠运行时信 
    

    ​ 息来发现该对象和类的真实信息

    反射的作用

    ​ 通过反射可以使程序代码访问装载到JVM 中的类的内部信息

    	获取已装载类的属性信息 
    

    ​ 获取已装载类的方法

    ​ 获取已装载类的构造方法信息

    反射技术的引入

    ​ 在JDK中,主要由以下类来实现Java反射机制,这些类都位于

    ​ java.lang.reflect 包中

    Class类:代表一个类

    Field 类:代表类的成员变量(属性)

    Method类:代表类的成员方法

    Constructor 类:代表类的构造方法

    Array类:提供了动态创建数组,以及访问数组的元素的静态方法

    反射技术的入口类Class
    • Class类是Java 反射机制的起源和入口

    ​ 用于获取与类相关的各种信息

    ​ 提供了获取类信息的相关方法

    ​ Class类继承自Object类

    • Class类是所有类的共同的图纸

      ​ 每个类有自己的对象,好比图纸和实物的关系

      ​ 每个类也可看做是一个对象,有共同的图纸Class,存放类的结构信息,

      ​ 能够通过相应方法取出相应信息

        		类的名字 
      
        		属性 
      
        		方法 
      

      ​ 构造方法

      ​ 父类和接口

    class常用方法:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3XLVC94E-1574769376392)(D:\学习文件\博课\img\反射class.png)]

    使用反射可以在编译和运行期间动态获取类的信息

    1.获取类class对象

    ​ 获取方式:①、通过类对象获取类的Class

    ②、通过类的名称、类名.class

    ③、通过完整路径字符串获取

    Class c=Class.forName(“类的路径”);

    2.获取类中属性Field

    ​ ①、获取类中所有public属性

    ​ Field[] f=Class.getFields();

    a.getName(), a.getType().getSimpleName()//取成员类型

    –getFields(); //获得所有public属性

    –getField(String name);//获得指定public属性

    Field getDeclaredField(String name) 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
    Field[] getDeclaredFields() 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
    3.获取类中方法methods

    ​ ①、获取类中所有的public的方法、不仅时当前类的,还能获取到所有继承类的public的方法

    ​ Method m[]=class.getMethods();

    –getMethods(); //获得所有public方法

    –getMethod(String name,Class[] args);//获得指定public方法

    参数传递的是Class类型,基本数据类型的class与它封装类的class是不一样的 例:int.class;

    Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
    Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

    获取方法的参数 Parameter

    ​ m.getName(); 方法名 m.getReturnType(); 方法返回值 类型

    ​ Parameter[] p=m.getParameters(); 方法所有参数

    4.类的基本信息(包路径Package)

    ​ ①、Package age=类名.getPackage;

    在反射中,java将类中所有的信息都封装成了对象


    类–>Class

    T newInstance() 创建此 Class 对象所表示的类的一个新实例。 类似于调用该类的无参构造方法
    Field[] getDeclaredFields 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段
    Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
    Constructor<T> getConstructor(Class<?>… parameterTypes) 返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
    Constructor<?>[] getConstructors() 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

    包–>Package

    属性–>Field
    返回值 方法 描述
    String getName() 返回此 Field 对象表示的字段的名称
    Class<?> getType() 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。 .getSimpleName()//取成员类型

    Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField(“name”)方法获取,通过set(obj, “李四”)方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

    方法–>Mothod

    Class.getMethod(String, Class…) 和 Class.getDeclaredMethod(String, Class…)方法可以获取类中的指定方法,

    如果为私有方法,则需要打开一个权限。setAccessible(true);

    用invoke(Object, Object…)可以调用该方法,

    跟上面同理,也能一次性获得所有的方法

    参数–>Parameter

    构造方法–>Constructor
    T newInstance(Object… initargs) 使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

    getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance(“张三”,20)方法创建对象


    接口–>interfaces()

    ​ Class[] getInterfaces():确定此对象所表示的类或接口实现的接口

    返回值:接口的字节码文件对象的数组

    2.6、获取指定资源的输入流

    InputStream getResourceAsStream(String name)

    return:一个 InputStream 对象;如果找不到带有该名称的资源,则返回null

    参数:所需资源的名称,如果以"/“开始,则绝对资源名为”/"后面的一部分。

    ​ 2.7、动态代理的概述和实现

    动态代理:一种设计模式,其非常简单,很容易理解,你自己可以做这件事,但是觉得自己做非常麻烦或者不方便,所以就叫一个另一个人(代理)来帮你做这个事情,而你就不用管了,这就是动态代理。举个例子,买火车票叫人代买。

    在程序运行过程中产生的这个对象,而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

    在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib,Proxy类中的方法创建动态代理类对象

    分三步,但是注意JDK提供的代理正能针对接口做代理,也就是下面的第二步返回的必须要是一个接口。

    1、new出代理对象,通过实现InvacationHandler接口,然后new出代理对象来。

    2、通过Proxy类中的静态方法newProxyInstance,来将代理对象假装成那个被代理的对象,也就是如果叫人帮我们代买火车票一样,那个代理就假装成我们自己本人

    3、执行方法,代理成功


    反射总结(简单运用)

    —获取字节码 Class.forname(“包名.文件名”);

    –获取构造方法 getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的 newInstance(“张三”,20)方法创建对象


    0、通过反射创建对象的方式

    1、Class对象的newInstances()

    2、通过构造函数对象的newInstances()

    1、对属性值的操作

    Filed对象.getXXX(Object obj) : obj表示当前反射的类的对象

    ​ .setXXX(Object obj)

    2、执行方法操作

    通过method对象的invoke(Object obj,Object… param)调用方法

    3、Array用于操作数组

    创建数组:Array.newInstance(String.class, 3);

    往数据里存入数据:Array.set(arr, 0, “100”);

    取出指定下标的数据:Array.get(arr0, 1)

    ect obj) : obj表示当前反射的类的对象

    ​ .setXXX(Object obj)

    2、执行方法操作

    通过method对象的invoke(Object obj,Object… param)调用方法

    3、Array用于操作数组

    创建数组:Array.newInstance(String.class, 3);

    往数据里存入数据:Array.set(arr, 0, “100”);

    取出指定下标的数据:Array.get(arr0, 1)

    展开全文
  • 浅析学编程语言PHP/JAVA 你会下一个牛起来的人吗? PHP什么? PHP 一种用来制作动态网页的服务器端脚本语言。你通过PHP和HTML创建页面。当访问者打开网页时,服务器端便会处理 PHP 指令,然后把其处理结果送...
  • Java反射是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public、static等)、supe...
  • Java 反射理解

    2018-07-09 15:29:43
    反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言? 一、动态语言 动态语言,是指程序在运行时可以改变其...二、Java是动态语言吗 从动态语言能在运行时改变程序结构结构或则变量类...
  • 反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?一、动态语言动态语言,是指程序在运行时...二、Java是动态语言吗?从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和...
  • Java反射机制解读

    2018-06-03 11:17:46
    反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?一、动态语言动态语言,是指程序在运行时...二、Java是动态语言吗?从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和...
  • Java反射概念与基础

    2018-08-14 10:21:00
    反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言? 一、动态语言 动态语言,是指程序在运行时可以改变其...二、Java是动态语言吗? 从动态语言能在运行时改变程序结构结构或则...
  • Java反射机制

    2017-09-14 14:23:47
    一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言。 但JAVA它却有着一个非常突出的动态相关机制:反射。通过...
  • 全部展开让我们先谈谈安全性,让我们了解一下概念JAVA语言的反射机制:在Java运行时环境中动态方法调用 ... 使java具有动态语言的特征.JAVA反射机制主要提供以下功能:1. 确定运行时任何对象所属的类2. 在运行时构造任...
  • Java动态链接

    千次阅读 2006-08-13 07:00:35
    Java 语言与C/C++ 在语法上很相似,但是由于它伴随着互连网络成长起来的,为了迎合异构主机构架以及支持安全的软件分发,逐步发展成为一个语言平台。 我们知道如果用C/C++写程序,从源代码到可执行程序需要...
  • java反射详解---反射的理论知识

    千次阅读 2016-08-20 00:21:02
    一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言。 但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射,...
  • 一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言。 但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射...
  • java是一种工业级的编程语言。无论使用者水平如何,java开发出来的程序不会太差。java安全性1、JAVA是一门强类型的静态语言,几乎什么都能做。而PHP只是一个超文本解释器而已,它的诞生之初只是为了网页动态化。2、...
  • 反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言? 一、动态语言 ...动态语言,是指程序在运行时可以改变其结构:新的函数...二、Java是动态语言吗? 从动态语言能在运行时改变
  • 一、动态语言动态语言,是指程序在运行时可以...二、Java是动态语言吗?从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和C、C++一样都不属于动态语言。但是JAVA却又一个非常突出的与动态相关的机制:...
  • 反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言? 一、动态语言 动态语言,是指程序在运行时可以改变其结构:新的...二、Java是动态语言吗? 从动态语言能在运行时改变程序结...
  • Java 反射机制分析

    2015-04-01 16:23:12
    一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言。 但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射,...
  • Java反射机制分析指南

    2017-08-09 09:45:02
    一、JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,Java和C++一样,都不是动态语言。 但JAVA它却有着一个非常突出的动态相关机制:反射。通过反射...
  • 动态语言面面观

    2008-12-06 14:32:00
    动态语言面面观 ...但是对于动态语言越来越受重视很多人的共识。众多的动态语言当中,谁将成为主流语言,众说纷芸,各持已见。那么,您同意作者的观点吗? 标签:脚本PHPJava.Net动态语言 ...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 331
精华内容 132
关键字:

java是动态语言吗

java 订阅