关于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. Jconsole加载Jtop插件

    Jconsole加载Jtop插件http://automationqa.com/forum.php?mod=viewthread&tid=3719&fromuid=2

  2. [转载]IE678兼容性前缀区分

    符合一贯简单的风格,只需记住两个符号 _ 和 * 看例子: #main { background:black; *background:red; _background:blue; } 第一句会被所有 ...

  3. android自定义view仿照MIUI中音量控制效果

    先看效果图: 这就是miui中的音量效果图,实现思路是自定义视图,绘制圆环,然后设置进度显示. 核心代码在onDraw中实现如下: @Override protected void onDraw(Ca ...

  4. jar包制作

    1,利用jdk自带的工具制作 1) 首先要确保所有的java文件都被编译成了.class文件,可以用javac批量编译多个文件 javac c:\java\src\wz\learning\*.java ...

  5. uniGUI试用笔记(十五)通过URL控制参数

    通过URL代入参数,在代码中读取,如: http://localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12 在代码中可以通过: ...

  6. Part 1: Running Oracle E-Business Suite on Oracle Cloud

    You can now run Oracle E-Business Suite on Oracle Cloud.  EBS customers can take advantage of rapid ...

  7. 实战:ajax带参数请求slim API

    restful api 支持get,post,put,delete等方法,那么jquery客户端怎么去实现呢?涉及到跨域又怎么办? 很多时候需要传递一个token(api_key) 去识别用户身份,获 ...

  8. c++ 模板元编程的一点体会

    趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...

  9. [转]C# dataGridview 报“索引-1没有值”的解决办法

    很多WINFORM的开发人员在DataGridView的开发当中,都会出现“索引-1没有值”这个烦人的问题,其实较早之前,我已经大概知道问题的所在,也找到了解决方法,不过一直没有时间去深入研究一下,今 ...

  10. java io系列06之 序列化总结(Serializable 和 Externalizable)

    本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...