关于MethodHandle类,这个类是在jdk1.7之后加入的,这个类的作用类似函数指针的意思

这个类中有一个方法

这里我的jdk有一个问题,就是我在进行MethodHandle操作的时候,我们会发现我们的方法只能设定想要的返回值和参数,但是我们相应的方法里面却不能对这些方法进行操作,参数能操作的int类型的会报错,char也会报错

但是double类型不会出错

 package ch08.MethodHandle;

 import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType; import static java.lang.invoke.MethodHandles.lookup; /**
*
* 功能:测试使用MethodHandleTest这个类
* 时间:上午9:49:16
* 文件:MethodHandleTest.java
*
* @author Administrator
*
*/
public class MethodHandleTest
{
static class ClassA
{
public void println(String s)
{
System.out.println(s);
} public void xixi(char g)
{
System.out.println("zheli shi gg" + g); char a = 'a';
a = g; //以下片段加上就会报错!!!!
// int a = 1;
// a = a + g;
//char s = (char) ('a' + g);
// return s;
}
} public static void main(String[] args) throws Throwable
{
Object obj = System.currentTimeMillis() % 2 == 0 ? System.out : new ClassA(); // 这个方法调用的结果是不论实际类型是那种,最终都可以实现对应的操作
//getPrintlnMH(obj).invokeExact("aksdjadj"); getPrintXixi(obj).invokeExact(3.25);
} private static MethodHandle getPrintXixi(Object clazz) throws NoSuchMethodException, IllegalAccessException
{
MethodType mt = MethodType.methodType(void.class, char.class); return lookup().findVirtual(clazz.getClass(), "xixi", mt).bindTo(clazz);
} private static MethodHandle getPrintlnMH(Object reveiver) throws Throwable
{
// 这个是方法类型,第一个参数是返回类型,第二个参数是我们的参数类型,后面还有可以有其他的类型
MethodType mt = MethodType.methodType(void.class, String.class); // 这个lookup方法中find是用来查找我们制定的类里面时候含有这个println这个类和相对应的方法类型,然后我们的bindto是返回这个方法的MethodHandle句柄
return lookup().findVirtual(reveiver.getClass(), "println", mt).bindTo(reveiver);
}
}

报错还根据我么执行的次数不同有差异!!!!

我们再看看这个

 package ch08.MethodHandle;

 import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType; import static java.lang.invoke.MethodHandles.lookup; /**
*
* 功能:测试使用MethodHandleTest这个类
* 时间:上午9:49:16
* 文件:MethodHandleTest.java
*
* @author Administrator
*
*/
public class MethodHandleTest
{
static class ClassA
{
public void println(String s)
{
System.out.println(s);
} public void xixi(char g)
{
System.out.println("zheli shi gg" + g); char a = 'a';
a = g; //以下片段加上就会报错!!!!
// int a = 1;
// a = a + g;
//char s = (char) ('a' + g);
// return s;
} public void xixi(double g)
{ double a = 2.565; a += g; //好吧,如果上面这句没有进程输出的话,那么就会在下一句爆粗,无法输出!!!!
System.out.println("zheli shi gg" + g);
System.out.println("zheli shi gg" + a); //以下片段加上就会报错!!!!
// int a = 1;
// a = a + g;
//char s = (char) ('a' + g);
// return s;
}
} public static void main(String[] args) throws Throwable
{
Object obj = System.currentTimeMillis() % 2 == 0 ? System.out : new ClassA(); // 这个方法调用的结果是不论实际类型是那种,最终都可以实现对应的操作
//getPrintlnMH(obj).invokeExact("aksdjadj"); getPrintXixi(obj).invokeExact(3.25);
} private static MethodHandle getPrintXixi(Object clazz) throws NoSuchMethodException, IllegalAccessException
{
// MethodType mt = MethodType.methodType(void.class, char.class);
MethodType mt = MethodType.methodType(void.class, double.class); return lookup().findVirtual(clazz.getClass(), "xixi", mt).bindTo(clazz);
} private static MethodHandle getPrintlnMH(Object reveiver) throws Throwable
{
// 这个是方法类型,第一个参数是返回类型,第二个参数是我们的参数类型,后面还有可以有其他的类型
MethodType mt = MethodType.methodType(void.class, String.class); // 这个lookup方法中find是用来查找我们制定的类里面时候含有这个println这个类和相对应的方法类型,然后我们的bindto是返回这个方法的MethodHandle句柄
return lookup().findVirtual(reveiver.getClass(), "println", mt).bindTo(reveiver);
}
}

当我们的类型是double类型的时候

我们得到了相应的输出,如果是int类型的话,那么就会报错,提示找不到相应的方法

而且我们吧两句输出中的上面一个去掉的话那么也会报错!!!!

具体原因是什么还没有得到确切的答案!!!!

如有知道,还望告知。

【JVM】2、关于jdk7的MethodHandle类的更多相关文章

  1. <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  2. JDK6与JDK7中String类subString()方法的区别

    1.subString()方法的作用 subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串 ...

  3. 关于JVM加载class文件和类的初始化

    关于JVM加载class文件和类的初始化 1.JVM加载Class文件的原理机制 1.1.装载 查找并加载类的二进制数据 1.2.链接 验证:确保被加载类的正确性.(安全性考虑) 准备:为类的静态变量 ...

  4. java的MethodHandle类详解

    一.总述   java7为间接调用方法提供了MethodHandle类,即方法句柄.可以将其看作是反射的另一种方式. 这是使用MethodHandle调用方法的一个例子: public class T ...

  5. <JVM中篇:字节码与类的加载篇>04-再谈类的加载器

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  6. <JVM中篇:字节码与类的加载篇>02-字节码指令集

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  7. <JVM中篇:字节码与类的加载篇>01-Class字节码文件结构

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  8. JVM学习笔记-第六章-类文件结构

    JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...

  9. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

随机推荐

  1. C#导出Excel,并且设置Excel单元格格式,合并单元格.

    注:要添加COM组件 Microsoft Excel 11.0 Object Library  引用. 具体代码如下: using System; using System.Collections.G ...

  2. 多条件动态LINQ 组合查询

    本文章转载:http://www.cnblogs.com/wangiqngpei557/archive/2013/02/05/2893096.html 参考:http://dotnet.9sssd.c ...

  3. 在CodedUI中使用JQuery选择器

    在CodedUI中使用JQuery选择器http://automationqa.com/forum.php?mod=viewthread&tid=3574&fromuid=29

  4. shell来start、stop、restart应用程序模板

    这里使用shell中的case语法: case分支语句格式如下: case $变量名 in 模式1) 命令列表 ;; 模式2) 命令列表 ;; *) ;; esac case行尾必须为单词“in”,每 ...

  5. thinkphp 3.2.3+Admin LTE后台框架

  6. JDBC数据库编程基本流程

    1.加载驱动类 Class.forName("");   2.创建数据库连接 Connection con = DriverManager.getConnection(url, u ...

  7. CSS HACK 及常见问题

    一.CSS常用hack 1.方式一:条件注释法 这种方式是IE浏览器专有的Hack方式,微软官方推荐使用的hack方式.举例如下 只在IE下生效 <!--[if IE]> 这段文字只在IE ...

  8. 【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)

    XML为一种可扩展的标记语言,是一种简单的数据存储语言,使用一系列简单的标记来描述. 一.SAX解析 即Simple API for XML,以事件的形式通知程序,对Xml进行解析. 1.首先在Web ...

  9. QCopChannel的用法

    QT提供了很多的进程间通讯的方法,例如共享内存,QProcess等等.但有一种方法是嵌入式端所独有的,那就是Qt Communications Protocol(QCOP)QT通讯协议,这种方法只能用 ...

  10. 说说你所熟知的MSSQL中的substring函数

    说说你所熟知的MSSQL中的substring函数 *:first-child { margin-top: 0 !important; } body>*:last-child { margin- ...