精华内容
下载资源
问答
  • 但是JVM希望扩展成可以支持动态语言。JDK从1.7开始,引入了新的字节码指令:invokedynamic从而扩展了对于动态语言的支持。MethodHandle这是动态语言支持的方法句柄。Java7在JSR 292中增加了对动态类型语言的支持,...

    介绍

    首先,Java是一门静态语言。但是JVM希望扩展成可以支持动态语言。JDK从1.7开始,引入了新的字节码指令:invokedynamic从而扩展了对于动态语言的支持。

    MethodHandle

    这是动态语言支持的方法句柄。

    Java7在JSR 292中增加了对动态类型语言的支持,使得java也可以像C语言那样将方法作为参数传递。

    在java.lang.invoke包中MethodHandle作用类似于反射中的Method类,但它比Method类要更加灵活和轻量级。

    Reflection是java api层面的反射调用,而MethodHandle则是jvm层面支持调用。因此Reflection是重量级,MethodHandle则是轻量级的。

    具体方法调用实例:

    1.创建MethodType对象,指定方法的签名(即方法参数以及方法返回值的类型)。

    2.在MethodHandles.Lookup中查找类型为MethodType的MethodHandle

    3.传入方法参数并调用MethodHandle.invoke或者MethodHandle.invokeExact方法。

    具体代码实现:

    public class Demo10 {

    public String toString(String test) {

    return "test" + test;

    }

    public static void main(String args[]) throws Throwable {

    Demo10 demo10 = new Demo10();

    MethodHandle mh = getString();

    //调用具体方法

    String str = (String) mh.invokeExact(demo10, "dsasdasd");

    System.out.println(str);

    MethodHandle methodHandle = mh.bindTo(demo10);

    String value = (String) methodHandle.invokeWithArguments("sdsadsad");

    System.out.println(value);

    }

    public static MethodHandle getString() {

    //设置方法的返回值以及参数列表中的类型

    MethodType mt = MethodType.methodType(String.class, String.class);

    MethodHandle mh = null;

    try {

    //通过lookup的findXXX方法找到对应的methodhandle

    mh = MethodHandles.lookup().findVirtual(Demo10.class, "toString", mt);

    } catch (Exception e) {

    e.printStackTrace();

    }

    return mh;

    }

    }

    MethodHandle和Reflection的区别:

    1.本质上讲,Relection和MethodHandle机制都是在模拟方法调用,但Reflection是在模拟Java代码层次的方法调用,而MethodHandle是在模拟字节码层次的方法调用。在MethodHandles.lookup中的3个方法-findStaitc、findVirtual、findSpecial正是为了对应于invokestatic、invokevirtual和invokespecial这几条字节码指令的执行权限校验行为,而这些底层细节在使用Reflection API时是不需要关心的。

    2.Reflection中的java.lang.reflect.Method对象远比MethodHandle机制信息含量多,换句话说,Reflection是重量级,而MethodHandle是轻量级。

    3.由于MethodHandle是对字节码的方法指令调用的模拟,所以理论上虚拟机做了各种优化。

    4.Reflection API的设计目标是只为Java语言服务的,而MethodHandle则设计成可服务于所有Java虚拟机之上的语言,其中也包括Java。。

    展开全文
  • JDK 7 增加了对 JSR 292 的支持,在 JVM 中动态类型语言的运行速度将变得更快。...此次JDK 7在动态语言支持上的更新是Java平台发展的重要趋势之一,在今年6月的JavaOne大会上,这些基于Java平台的动态语...

    JDK 7 增加了对 JSR 292 的支持,在 JVM 中动态类型语言的运行速度将变得更快。这一支持的关键在于增加了新的 Java 字节码,invokedynamic,它用于方法调用,还有新的连接机制,其中包含了一个新的构造:方法句柄(method handle)。此次JDK 7在动态语言支持上的更新是Java平台发展的重要趋势之一,在今年6月的JavaOne大会上,这些基于Java平台的动态语言也十分的活跃。

    动态类型语言和 JVM

    JVM 可以执行 Java 程序,将其编译机器独立的字节码。事实上,任何可以使用有效 class 文件表述的功能性语言,都可以运行在 JVM 上。

    多年来,运作在 JVM 上语言一直在增加,从 armed Bear for Common Lisp 到Yoix.动态语言的 JVM 实现也越来越多,比如 JRuby 和 Jython,以及 Groovy 脚本语言。

    动态语言的灵活性,尤其是脚本语言,对于实验性、原型应用程序以及需频繁更新的程序,都具有独特的吸引力。这种灵活性源自动态类型。动态类型语言中运行时(runtime)验证程序中的值是否与预期类型一致,相对的,静态类型语言,如 Java,是在编译期间检查变量类型,而不是值类型。值得一提的是,Java 平台上另一个前景很被看好的静态语言就是Scala:包括Java之父和Groovy创始人在内的很多开发者都很看好Scala这个强类型的、可扩展性良好的静态语言。

    通常,动态类型比静态类型更具灵活性,因为前者允许程序根据运行时的数据生成类型。不过静态类型语言的执行更为高效,因为它能够在编译期间排除错误。

    动态类型固有的灵活性与 JVM 的执行效率,合二为一。很明显,这就是它能够吸引动态编程语言创建者以及使用这些语言构建应用程序的开发者的原因。

    JSR 223 动态语言支持的第一步

    JSR 223: Scripting for the Java Platform 是将动态语言引入 JVM 的第一步,它是一个规范,定义了从动态脚本语言代码访问 Java 代码的 API 接口。它还指定了一个 framework 框架,用户在 Java 应用程序中运行脚本引擎。该规范及其实现使得包含 Java 和脚本代码的应用程序的创建更为容易。

    动态类型语言的问题

    为运行在 JVM 上的动态类型语言开发引擎,必须满足 JVM 所执行的 Java 字节码的要求,而字节码专为静态类型语言设计。对于引擎开发者,当生成字节码用于方法调用,这种设计一直都是棘手的难点。

    方法调用的字节码要求

    静态类型语言中编译时进行类型检查,意味着方法调用,以及它生成的字节码,需要知道该方法返回的值类型,以及调用中指定的参数类型。

    下面为一段 Java 代码:

    String s="Hello World";

    System.out.println(s);

    这里参数类型是已知的。System.out.println()并不返回值,如果方法返回值,需要指定返回值的类型。

    以上代码相应的字节码如下:

    ldc #2astore_1

    getstatic #3aload_1 invokevirtual #4//Method java/io/PrintStream.println:(I)V

    JVM 中字节码的执行通常包含对操作对象栈(operand stack)中值的操作。操作栈是一个相当于硬件寄存器的虚拟机。通常,字节码会指示 JVM 局部值压入操作对象栈,将值从栈中取出放进局部变量中,复制或交换栈中的值,或者执行生成或使用值的操作。

    展开全文
  • 对于子类调用父类的方法我们用super.Method()即可,但是倘若我们想调用其祖先类...这种方法模式使用了invokedynamic指令,使其具有动态语言的特性,用空可以去看看《深入理解Java虚拟机》这本书,可以参悟很多!!!

    对于子类调用父类的方法我们用super.Method()即可,但是倘若我们想调用其祖先类,并且在不改变其继承关系以及祖先和父类的代码的时候,该怎么办呢,代码样列如下:给大家三个类,可以先去了解再来熟悉下面的代码

    • MethodHandle 它是可对直接执行的方法或者字段或者构造方法的类型的引用,或者说他是一个有能力安全调用方法的对象。
    • MethodHandles 它是仅操作或返回方法句柄的静态方法的类。
    • MethodType 他是表示方法签名类型的不可变对象。每个MethodHandle都有一个MethodType实例,用来指明返回类型和参数类型。
    package vip.wulang.test;
    
    /**
     * @author coolerwu on 2018/8/13.
     * @version 1.0
     * @time 20:58
     */
    public class ParentTest {
        class GrandFather {
            public void thinking() {
                System.out.println("i am grandfather.");
            }
        }
    
        class Father extends GrandFather {
            @Override
            public void thinking() {
                System.out.println("i am father.");
            }
        }
    
        class Son extends Father {
            @Override
            public void thinking() {
                //如何调用GrandFather
            }
        }
    
        public static void main(String[] args) {
            new ParentTest().new Son().thinking();
        }
    }
    
    

    第一种方法

    package vip.wulang.test;
    
    /**
     * @author coolerwu on 2018/8/13.
     * @version 1.0
     * @time 20:58
     */
    public class ParentTest {
        class GrandFather {
            public void thinking() {
                System.out.println("i am grandfather.");
            }
        }
    
        class Father extends GrandFather {
            @Override
            public void thinking() {
                System.out.println("i am father.");
            }
        }
    
        class Son extends Father {
            @Override
            public void thinking() {
                GrandFather grandFather = new GrandFather();
                grandFather.thinking();
            }
        }
    
        public static void main(String[] args) {
            new ParentTest().new Son().thinking();
        }
    }
    //输出结果
    //i am grandfather.
    

    第二种方法也就是今天我要讲的这种,其他的反射之类的各位自行去解决

    package vip.wulang.test;
    
    import java.lang.invoke.MethodHandle;
    import java.lang.invoke.MethodHandles;
    import java.lang.invoke.MethodType;
    import java.lang.reflect.Constructor;
    
    /**
     * @author coolerwu on 2018/8/13.
     * @version 1.0
     * @time 20:58
     */
    public class ParentTest {
        class GrandFather {
            public void thinking() {
                System.out.println("i am grandfather.");
            }
        }
    
        class Father extends GrandFather {
            @Override
            public void thinking() {
                System.out.println("i am father.");
            }
        }
    
        class Son extends Father {
            @Override
            public void thinking() {
                MethodType methodType = MethodType.methodType(void.class);
                try {
                    Constructor<MethodHandles.Lookup> constructor = 
    	                MethodHandles.Lookup.class.getDeclaredConstructor(Class.class, int.class);
                    constructor.setAccessible(true);
                    MethodHandles.Lookup instance = constructor.newInstance(GrandFather.class, -1);
                    MethodHandle methodHandle = 
    	                instance.findSpecial(
    		                GrandFather.class, "thinking", methodType, GrandFather.class);
                    methodHandle.invoke(this);
                } catch (Exception e) {
                    e.printStackTrace();
                } catch (Throwable throwable) {
                    throwable.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            new ParentTest().new Son().thinking();
        }
    }
    //输出结果
    //i am grandfather.
    

    是不是很神奇

    其中MethodType.methodType();第一个参数是返回类型,后面的为参数类型。MethodHandles.Lookup中的构造方法我需要
    的是private Lookup(Class<?> lookupClass, int allowedModes)所以我利用了反射来获取到实例,也可以通过反射
    获取这个static final Lookup IMPL_LOOKUP = new Lookup(Object.class, TRUSTED);都是一样的,主要是因为在
    Lookup类中TRUSTED代表可信任的,可以访问任何方法,TRUSTED值为-1,而instance.findSpecial意思就是去这个类寻
    找带有thinking名字的并且参数类型以及方法类型一样的,最后invoke
    

    这种方法模式使用了invokedynamic指令,使其具有动态语言的特性,用空可以去看看《深入理解Java虚拟机》这本书,可以参悟很多!!!

    展开全文
  • java动态语言还是静态语言?Java动态语言还是静态语言?,Java是一种静态语言。Java是编译时确定的变量类型,不能在运行时更改,在类型转换中也是强制的。例如,当大规模整数类型转换为小规模整数类型时,必须...

    java是动态语言还是静态语言?Java是动态语言还是静态语言?,Java是一种静态语言。Java是编译时确定的变量类型,不能在运行时更改,在类型转换中也是强制的。例如,当大规模整数类型转换为小规模整数类型时,必须进行强转换。比如int必须强制转换才能得到小规模的类型字节;所以Java是一种静态的强类型语言。

    cfc41ea69babf1731371c81d643256f7.png

    推荐研究:《编程视频课程》

    Java是动态语言还是静态语言,是强类型还是弱类型?虽然我知道,但还是不够深入。大家一起讨论一下。

    图释

    偶然看到一张图片,完美区分了以上问题,如下图所示:

    bea2111d4ec2ce7ceae553cddebb58c9.png

    如图,Java是一种静态类型的强类型语言。来解释一下为什么。

    解释

    1.静态类型语言:定义变量时带有类型声明的语言。

    (1)变量的类型在编译时确定

    (2)运行时不能修改变量的类型

    这允许编译器确定运行时所需的内存总量。

    比如C,Scala,Java,F#都是静态类型语言。

    2.动态类型语言:定义变量时没有类型声明的语言。

    (1)变量的类型在运行时确定

    (2)变量的类型可以在操作过程中修改

    比如python、Javascript、Ruby都是动态类型语言。

    3.强类型定义语言

    强制数据类型定义的语言。也就是说,一旦给一个变量赋了某个数据类型,如果不进行强制转换,那么它永远是该数据类型。比如你定义了一个整型变量A,程序是不可能把A当成字符串类型的。强类型定义语言是一种类型安全的语言。

    4.弱类型定义语言

    数据类型可以忽略的语言。与强类型定义语言相反,变量可以被赋予不同数据类型的值。强类型定义语言在速度上可能不如弱类型定义语言,但是强类型定义语言带来的严谨性可以有效避免很多错误。

    总而言之:

    Java是编译时确定的变量类型,运行时不能更改,类型转换也是强制的。例如,当大规模整数类型转换为小规模整数类型时,它必须是强制的。例如,int必须是强制的,才能获得小规模类型字节。所以Java是一种静态的强类型语言。

    更多相关文章,请访问PHP中文网站!java是动态语言还是静态语言?更多详情,请关注Lei.com其他关于php知识的相关文章!

    展开全文
  • java是静态语言。...推荐学习:《编程视频课程》Java到底是动态语言还是静态语言,是强类型还是弱类型呢?虽然知道但是还是不够深入,接下来就一起探讨下吧。图释碰巧看到一张图,完美的区分了以...
  • 什么是动态语言和静态语言?http://haohetao.iteye.com/blog/589070   Java语言的动态性支持(一) http://uuhorse.iteye.com/blog/1705684   Java语言的动态性支持(二) ......
  • Java语言动态

    2016-08-21 10:48:03
    Java语言是静态语言,编译的时候会进行类型的检查,...与静态语言对应的是动态语言例如JavaScript,动态语言类型检查是在运行的时候进行的,这样代码相对比较简洁,现在介绍一下在Java虚拟机上运行脚本语言例如JavaScript
  • Java开源 动态语言

    2008-12-06 15:44:00
    Java开源 动态语言】 Groovy 点击次数:9177 Groovy是一种基于JVM的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性。 Groovy已在WebWork2中的应用。它可以被编译为标准的Java Bytecode。 Jython ...
  • 静态语言和动态语言的区别:区别一:静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型;比如C/C++ 是静态类型语言的典型代表,其他的静态类型语言还有 C#、...
  • java随笔——动态语言

    2013-09-29 16:41:35
    一般说到动态语言都是指在程序运行时允许改变程序结构或变量类型,从这个观点看,java和C++一样,都不是动态语言。 但是java有一种与动态语言非常类似的一种机制,反射。它允许java在运行时去操作未知的类、类的方法...
  • 除此之外如Ruby、Python、OC等也都属于动态语言,而C、C++、Java等语言则不属于动态语言。 动态类型语言,就是类型的检查是在运行时做的,是不是合法的要到运行时才判断,例如JavaScript就没有编译
  • JavaScript语言是动态语言、弱类型语言。 静态类型语言、动态类型语言分析: 静态类型语言:变量定义时有类型声明的语言。 1)变量的类型在编译的时候确定 2)变量的类型在运行时不能修改 这样编译器就可以确定...
  • java虚拟机动态类型语言支持

    千次阅读 2017-08-30 18:59:34
    这篇博客是根据《深入理解java虚拟机》的讲解和本人对动态类型语言的一些认识,来深度剖析一下java虚拟机对动态类型语言的支持!
  • java语言动态

    2008-12-18 18:17:52
    [align=center][b]Java语言动态特性[/b][/align] 贯穿整篇文章的公共线索是这样一种思想:在 Java 平台上编程要比使用直接编译成本机代码的语言更具动态性。 [b]用二进制表示的类[/b]...
  • Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标。
  • 今天小熙突然想到一个问题,那就是Java到底是动态语言还是静态语言,是强类型还是弱类型呢?虽然知道但是还是不够深入,接下来就一起探讨下吧。 二. 图释 小熙碰巧看到一张,完美的区分了以上的问题 如图所示,...
  • 我们不需要将动态语言编译为 Java字节码就可以在 Java 应用程序中使用它们。使用 Java Platform, Standard Edition 6 (Java SE)中添加的脚本包(并且向后兼容 Java SE 5),Java 代码可以在运行时以一种简单的...
  • 我们不需要将动态语言编译为 Java字节码就可以在 Java 应用程序中使用它们。使用 Java Platform, Standard Edition 6 (Java SE)中添加的脚本包(并且向后兼容 Java SE 5),Java 代码可以在运行时以一种简单的、统一...
  • Java 开发人员清楚 Java 并不是在任何...今年,1.0 版本的 JRuby 和 Groovy 的发行引领了一场热潮,促使人们纷纷在自己的 Java 应用程序中添加动态语言。Groovy、JRuby、Rhino、Jython 和一些其他的开源项目使在所谓的
  • Java动态调用脚本语言Groovy

    千次阅读 2017-08-29 13:56:23
    java.util.HashMap; import java.util.List; import java.util.Map; import javax.script.Bindings; import javax.script.Invocable; import javax.script.ScriptContext; import javax.script....
  • 本文为笔记,来自《深入理解Java7》和网络技术文。 1)方法句柄method handle 对Java中方法、构造方法和域(getter|setter)的一个强类型的可执行的引用。通过方法句柄可以直接调用该句柄所引用的底层方法。对应java...
  • 安卓动态调试的课题太大,先说一下Java语言
  • 除此之外如Ruby、Python、OC等也都属于动态语言,而C、C++、Java等语言则不属于动态语言。 动态类型语言,就是类型的检查是在运行时做的,是不是合法的要到运行时才判断,例如JavaScript就没有编译错误,只要运行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,588
精华内容 10,635
关键字:

java动态语言

java 订阅