MethodHandle

来源:互联网 发布:udp自定义端口号 编辑:程序博客网 时间:2024/05/17 20:35
public class Person {private String name ;private Integer score ;public Person(){}public Person(String name , Integer score) {        this.name = name ;        this.score = score ;}public String gao(Integer a , Integer b){return "say=" + (a+b) ;}public String ri(){return "sayHello to " + name + ".  score = " + score ; }}

import java.lang.invoke.MethodHandle;import java.lang.invoke.MethodHandles;import java.lang.invoke.MethodType;public class MethodHandleTest {    public MethodHandle getHandler() {        MethodHandle mh = null;        /*第一个参数为返回值,陆续为入参*/        MethodType mt = MethodType.methodType(String.class, Integer.class, Integer.class);         MethodHandles.Lookup lk = MethodHandles.lookup();        try {        /*第一个参数为所调用方法所在的类.class  , 第二个参数为方法名 , 第三个参数为MethodType*/            mh = lk.findVirtual(Person.class, "gao", mt);        } catch (Throwable e) {            e.printStackTrace();        }        return mh;    }        public MethodHandle getHandler2() {        MethodHandle mh = null;        /*不需要入参则不需要写*/        MethodType mt = MethodType.methodType(String.class) ;        MethodHandles.Lookup lk = MethodHandles.lookup();        try {            mh = lk.findVirtual(Person.class, "ri", mt);        } catch (Throwable e) {            e.printStackTrace();        }        return mh;    }         public static void main(String[] args) throws Throwable {        MethodHandle mh = new MethodHandleTest().getHandler();        String result = (String) mh.invokeExact(new Person() , Integer.valueOf(1) , Integer.valueOf(2)) ;        System.out.println(result) ;                mh = new MethodHandleTest().getHandler2();        result = (String) mh.invokeExact(new Person("laoli" , 100)) ;        System.out.println(result) ;    }}

say=3
sayHello to laoli.  score = 100




0 0