【JVM】2、关于jdk7的MethodHandle类
关于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类的更多相关文章
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- JDK6与JDK7中String类subString()方法的区别
1.subString()方法的作用 subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串 ...
- 关于JVM加载class文件和类的初始化
关于JVM加载class文件和类的初始化 1.JVM加载Class文件的原理机制 1.1.装载 查找并加载类的二进制数据 1.2.链接 验证:确保被加载类的正确性.(安全性考虑) 准备:为类的静态变量 ...
- java的MethodHandle类详解
一.总述 java7为间接调用方法提供了MethodHandle类,即方法句柄.可以将其看作是反射的另一种方式. 这是使用MethodHandle调用方法的一个例子: public class T ...
- <JVM中篇:字节码与类的加载篇>04-再谈类的加载器
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM中篇:字节码与类的加载篇>02-字节码指令集
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM中篇:字节码与类的加载篇>01-Class字节码文件结构
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- 从字节码和JVM的角度解析Java核心类String的不可变特性
1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...
随机推荐
- WPF读写config配置文件
1. 在你的工程中,添加app.config文件.文件的内容默认为: 1 <?xml version="1.0" encoding="utf-8" ?&g ...
- FFmpeg编译出错_img_convert 找不到
问题出现在下载的ffmpeg的版本不一样,在0.4.8以前的版本中还有img_convert这个函数,新版本中用sws_getContext和sws_scale代替了.简单说明如下: 新版本的ffmp ...
- c# C++接口封装 汽车模拟仿真
struct PinCamParIn//用户输入的针孔相机参数结构体{ char CameraName[512]; float Offset[3]; float Angle[3]; ...
- libevent源码深度剖析
原文地址: http://blog.csdn.net/sparkliang/article/details/4957667 第一章 1,前言 Libevent是一个轻量级的开源高性能网络库,使用者众多 ...
- Objective-C之类和对象
http://www.cnblogs.com/kenshincui/p/3861302.html
- JavaWeb学习系列——第一个JavaWeb程序
创建JavaWeb项目 Eclipse中新建一个Dynamic Web Project 指定项目名称.依赖环境 勾选生成web.xml选项 更改项目编译输出目录,项目右键 ->propertie ...
- IOS雕虫小技
1,你所不知道的Mac截图的强大 2,抓包工具WireShark开发必备,需要装X11插件 3,Mac远程控制Windows桌面-CoRD.或者TeamViewer 4,Mac下解压缩BetterZi ...
- Unity 中的协同程序
今天咱就说说,协同程序coroutine.(这文章是在网吧敲的,没有unity,但是所有结论都被跑过,不管你信得过我还是信不过我,都要自己跑一下看看,同时欢迎纠错)先说说啥是协程:协同程序是一个非常让 ...
- C#连接Oracle简单教程
要点:本文主要介绍如何使用最简单的方法让C#操作Oracle数据库,不需要安装Oracle客户端之类的东西. 最近由于工作需要,要使用C#从SQLServer向Oracle导入数据.之前没有怎么接触过 ...
- 【转载】一步一步写算法(之hash表)
转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaox ...