本文为笔记,来自《深入理解Java7》和网络技术文。
1)方法句柄method handle
对Java中方法、构造方法和域(getter|setter)的一个强类型的可执行的引用。通过方法句柄可以直接调用该句柄所引用的底层方法。对应java.lang.invoke.MethodHandle类。类点类似C/C++里面的函数指针。
2)类结构
在附件
3)使用方法句柄进行函数式编程
=>对数值进行操作:对数组中的每个元素依次执行某个操作
=>方法的柯里化:对一个方法的参数值进行预先设置之后,得到一个新的方法
4)MethodHandle VS Reflection
[转后再转,二次转,源为infoQ,http://blog.csdn.net/tobeandnottobe/article/details/7248164]
=>模拟方法调用层次:Reflection是在模拟Java代码层次的方法调用,而MethodHandle是在模拟字节码层次的方法调用。在MethodHandles.Lookup上的三个方法findStatic()、findVirtual()、findSpecial()正是为了对应于invokestatic、invokevirtual & invokeinterface和invokespecial这几条字节码指令的执行权限校验行为,而这些底层细节在使用Reflection API时是不需要关心的。
=>包含信息:Reflection中的java.lang.reflect.Method对象远比MethodHandle机制中的java.lang.invoke.MethodHandle对象所包含的信息来得多。前者是方法在Java一端的全面映像,包含了方法的签名、描述符以及方法属性表中各种属性的Java端表示方式,还包含有执行权限等的运行期信息。而后者仅仅包含着与执行该方法相关的信息。用开发人员通俗的话来讲,Reflection是重量级,而MethodHandle是轻量级,功能更强大、使用更灵活、性能更好。
=>优化:由于MethodHandle是对字节码的方法指令调用的模拟,那理论上虚拟机在这方面做的各种优化(如方法内联),在MethodHandle上也应当可以采用类似思路去支持(但目前实现还不完善)。而通过反射去调用方法则不行。
=>设计目标服务对象:Reflection API的设计目标是只为Java语言服务的,而MethodHandle则设计为可服务于所有Java虚拟机之上的语言,其中也包括了Java语言而已。
5)invokedynamic指令
http://han.guokai.blog.163.com/blog/static/13671827120118125237946/暂时不怎么懂
invokedynamic指令用于支持非Java语言,尤其是动态语言,目前Java编译器不能自动生成invokedynamic指令。
=>Invokedynamic指令将“链接”延迟到运行时才执行,本来是在编译时完成的。是通过“使运行时系统能够自定义调用点和方法实现之间的连接”来实现的。动态调用的调用点通过引导方法连接到一个方法上,这个引导方法是由动态语言编译器指定的,并被JVM调用一次来连接到位置上。
=>动态调用指令简化并潜在改善了JVM上动态语言的编译器和运行时系统的实现。动态调用指令是通过允许语言实现者自定义连接行为做到这点的。这是和其它JVM指令对比而言的,如虚调用指令(invokevirtual)的连接行为是特定于Java类和接口的,是由JVM硬连接的。
=>每个动态调用指令(invokedynamic instruction)的实例被称为一个动态调用点(dynamic call site)。一个动态调用点最初是未连接的状态,表示这个调用点没有指定可调用的方法。如前面所述,动态调用点通过引导方法连接到一个方法上。引导方法是由动态语言编译器所指定的方法,并被JVM调用一次来连接到位置上。引导方法返回的对象持久地决定了调用点的行为。
=>使用动态调用指令调用动态链接方法步骤:①定义引导方法;②指定常量池条目;③使用动态连接指令
【补充】:
静态类型语言:在编译时进行类型检查的语言。
动态类型语言:在运行时进行类型检查的语言。
强类型语言:对其要操作的值的类型有特定的限制,可防止参数类型不对的操作执行。
弱类型语言:会隐式地对错误或不兼容类型的操作参数进行转换。
- 大小: 194.3 KB
分享到:
相关推荐
7. **动态语言支持**:JDK 7引入了 invokedynamic 指令,这是Java虚拟机的四大基础操作之一,用于支持动态类型语言的实现,如Groovy和JRuby。 8. **异常链**:JDK 7允许在捕获异常时保留原始异常信息,形成异常链,...
7. 多线程:Java内置了对多线程的支持,通过Thread类或实现Runnable接口创建线程。线程同步机制包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和相关的实现类。 8. 数据库操作:Java ...
一些工具还支持多种编程语言和多种主题样式,可以根据个人喜好进行选择。 - 代码分享和保密:分享代码时,要考虑代码的安全性,避免泄露敏感信息。例如,不要在公共笔记中包含数据库密码、API密钥等敏感信息。一些...
Java语言的培训总结笔记主要涵盖了Java语言的历史、特性、运行机制、内存管理以及程序环境的搭建。以下是对这些知识点的详细解析: 1. **Java语言的发展史**: Java起源于1991年,由Sun公司开发,最初命名为Oak。...
Java语言的特性包括面向对象、一次编写,到处运行。它具有丰富且强大的API,适用于企业级应用开发,尤其在大型系统架构中具有优势。 2. Java开发环境搭建 Java开发环境主要由JDK(Java Development Kit)组成,其中...
通过这份笔记,读者可以系统地学习Java语言,并逐步提升为一名熟练的Java开发者。 笔记内容涵盖了以下几个关键知识点: 1. **Java基础**:包括Java语言的基本语法、数据类型、控制结构(如if语句、switch语句、...
首先,我们来回顾一下Java语言的基础部分: 1. **Java环境搭建**:笔记可能包含如何下载JDK,配置Java环境变量,以及使用javac命令编译和java命令运行程序的基本步骤。 2. **语法基础**:包括数据类型(如整型、...
9. **动态语言支持** - 新的`invokedynamic`指令,为运行时绑定方法调用提供了支持,增强了Java与脚本语言的交互,比如Groovy和JavaScript。 10. **弃用和改进的API** - JDK 7中,一些过时的API被标记为废弃,如`...
JAVA 语言具有封装、继承、多态等特征,支持分布式程序设计、跨平台、多线程、网络语言等特性。 3. JAVA 类库 JAVA 类库是 JAVA 程序设计的核心部分,包含了许多类,每个类中包含许多的数据及处理这些数据的方法。...
7. **多线程**:Java内置了对多线程的支持,通过Thread类或实现Runnable接口可以创建并运行多个线程,实现并发执行。 8. **接口与内部类**:接口定义了一组方法签名,提供了一种实现多继承的方式。内部类(包括成员...
- **简单性**:Java语言设计简洁明了,易于学习和使用。 - **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。 #### 1.2 运行原理 Java程序的运行分为几个阶段: 1. **编写**:使用文本编辑器...
7. **多线程**:Java内置对多线程的支持,学习如何创建和管理线程,理解线程同步和互斥的概念,如synchronized关键字和wait/notify机制。 8. **反射与注解**:反射机制允许程序在运行时动态地获取类的信息并调用其...
JRuby则是Ruby语言在Java平台上的实现,同样支持通过Java的`ScriptEngine`接口来调用。在项目中添加JRuby的依赖后,可以这样运行Ruby代码: ```java ScriptEngineManager manager = new ScriptEngineManager(); ...
Java开发实战经典全套笔记是李兴华老师针对Java初学者及进阶者精心编写的教程集合,涵盖了Java语言的核心概念、重要特性和实际应用。这些笔记以PDF格式提供,易于阅读,同时也支持打印,便于离线学习和长期保存。...
Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年发布。它的设计目标是具备“简单性、面向对象、健壮性、安全性、可移植性、高效性、多线程和动态性”等特性。Java程序...
#### Java语言特点 1. **简单性**:语法简洁,易于学习。 2. **面向对象**:支持封装、继承、多态等OOP特性。 3. **跨平台性**:“一次编写,到处运行”的核心理念。 4. **高性能**:JVM优化和垃圾回收机制确保高效...
Java语言程序设计(一)串讲笔记(珍藏版) Java是一种广泛使用的高级编程语言,用于开发大规模应用程序、applet、小程序、游戏、Android应用程序等。在自考Java语言程序设计(一)串讲笔记(珍藏版)中,我们将...
这份压缩包文件包含了大量的Java编程知识点,旨在帮助初学者和有经验的开发者深入理解和掌握Java语言的核心概念与高级特性。以下是根据这份笔记整理的一些关键知识点: 1. **Java基础**:Java的基础语法是学习的...
7. **多线程**:Java内置了对多线程的支持,允许程序同时执行多个任务,提高了程序的效率。通过Thread类或Runnable接口可以创建并运行线程。 8. **网络编程**:Java提供了Socket编程接口,可以创建客户端和服务器...