美文网首页
JDK1.7新增的MethodHandle方法与反射调用的例子

JDK1.7新增的MethodHandle方法与反射调用的例子

作者: maxbin | 来源:发表于2018-03-19 10:13 被阅读44次
  • java中通过类调用类的方法之前一直使用反射的机制去做,但是jdk1.7中增加了对动态语言的支持,增加了MethodHandle方法

MethodHandle的Demo

新建一个类ClassA,方法println

public class ClassA {
    public void println(String s) {
        System.out.println(s);
    }
}

method handle方法使用

    private static MethodHandle getPrintlnMh(Object reveiver) throws NoSuchMethodException, IllegalAccessException {
        MethodType methodType = MethodType.methodType(void.class, String.class);
        return MethodHandles.lookup().findVirtual(reveiver.getClass(), "println", methodType).bindTo(reveiver);
    }

MethodType.methodType()第一个参数是返回类型,第二个以后的参数是方法入参

通过获取MethodType,调用invokeExact方法执行

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, Throwable {
        Object obj = new ClassA();

        getPrintlnMh(obj).invokeExact("MH ClassA:say hello");

    }
  • 在java代码中println方法拥有的对象必须是PrintStream的子类(实现了PrintStream接口的类),否则就算是对象确实有println(String)方法,代码依然不能运行,因为类型检查不合法。

MethodHandle调用System.out

    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, Throwable {

        Object obj = System.out;

        getPrintlnMh(obj).invokeExact("MH System.out:say hello");

    }

反射调用方法

    public static void main(String[] args) {

        Class<?> clazz = Class.forName("com.maxbin.invoke.mh.ClassA");

        Method method = clazz.getDeclaredMethod("println", String.class);

        method.invoke(clazz.newInstance(), "invoke say hello");

    }

反射获取的信息比MethodHandle要多。
反射是模拟java代码层面的调用,MethodHandle是模拟字节码层面的调用。

相关文章

  • JDK1.7新增的MethodHandle方法与反射调用的例子

    java中通过类调用类的方法之前一直使用反射的机制去做,但是jdk1.7中增加了对动态语言的支持,增加了Metho...

  • Java反射,动态代理,设计模式,JVM内存划分

    反射,终极手段,规则的破坏者。 静态与动态 实例 执行所加载类的方法 invoke执行方法例子 invoke调用私...

  • MethodHandle与反射Method区别

    在《深入理解 java 虚拟机》第二版第 8 章,上提出了一个问题,简要描述如下:在 Son 类中,调用 Gran...

  • 【Java 进阶】Java 反射

    反射:获取Class中所有字段(Field)与方法(Method),并实现调用(invoke) Java 反射简单...

  • Java 反射

    Java反射Java反射API获取Class对象通过反射创建实例对象,调用公共方法通过反射调用私有方法 一.Jav...

  • 反射机制(四)操作方法

    获取方法: 调用方法 问题一答案: 使用反射调用可变参数 使用反射调用静态方法: 静态方法不属于任何对象,属于类本...

  • Java反射

    一 什么是反射 无法通过new 关键字来获取对象并调用方法,通过JDK提供的反射API来进行反射调用,反射是...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Notes :C#

    反射可以动态的调用方法,当调用方法要省略默认参数时,使用Type.Missing 占位。

  • PHP 魔术方法__call和__callStatic

    PHP 5.3 后新增了 __call 与__callStatic 魔法方法。 用途: __call:当要调用的方...

网友评论

      本文标题:JDK1.7新增的MethodHandle方法与反射调用的例子

      本文链接:https://www.haomeiwen.com/subject/zbnlqftx.html