关于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. SQLSERVER吞噬内存解决记录

    现在手上有一个不大不小的系统,运行了一段时间,因为是24*7不断运行,所以内存逐渐增高,慢慢的会飙到95%以上,然后不得不重启电脑,因为用的是云,怕虚拟机重启down掉起不来,重启操作还只能在凌晨4. ...

  2. visual studio 2013使用技巧

    去掉 引用提示 文本编辑器=>所有语言=>codelens visual studio 由于以前的函数求值超时,函数求值被禁用.必须继续执行才能重新启用函数求值 visual studio ...

  3. strcpy和memcpy的区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

  4. Unity3d导出Android的apk文件时相关问题的解决办法

    今天上午着手将一个unity3d开发的小游戏build到android手机上运行,结果遇到了不少问题. 首先遇到的第一个问题是在build到一半的时候,弹出如下报错: Error building P ...

  5. POJ 3903 Stock Exchange

    Stock Exchange Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2954   Accepted: 1082 De ...

  6. 关于python协程的一个例子的学习

    例子来自https://blog.tonyseek.com/post/event-manage-with-greenlet/ 加了一些注释看懂了: 注释中的数字表示执行的顺序,这个简单的例子用到了py ...

  7. 推荐一款炫酷的提示框插件SweetAlert

    官方网址 http://t4t5.github.io/sweetalert/ 项目地址 https://github.com/t4t5/sweetalert

  8. Linux内核Makefile文件(翻译自内核手册)

    --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...

  9. Transactional replication 的Snapshot 文件在什么情况下会被清除

    Snapshot agent负责收集publication database的信息,将article的内容存储在snapshot文件中.而distribuiton cleanup job(后文简称清除 ...

  10. 单链表List的C实现

    头文件———————————————————————————————— //单链表的实现 #ifndef _LIST_H_ #define _LIST_H_ #include <stdlib.h ...