1 先创建一个实体类
import java.lang.invoke.MethodHandles;
public class Student {
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public static MethodHandles.Lookup lookup(){
return MethodHandles.lookup();
}
}
2 创建一个调用类
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class MethodHandlerRun {
public static void main(String[] args) throws Throwable {
Student student = new Student(1, "Yang");
MethodHandles.Lookup lookup = Student.lookup();
MethodHandle getName = lookup.findVirtual(Student.class, "getName", MethodType.methodType(String.class));
getName = getName.bindTo(student);
//Object name =getName.invokeExact();
String name = ((String) getName.invokeExact());
System.out.println(name);
}
}
在使用invokeExact的时候必须使用转型才可以,因为会通过声明来生成一个方法类型。如果不强行转型的话,会产生一个错误,如下
Exception in thread "main" java.lang.invoke.WrongMethodTypeException: expected ()String but found ()Object
可以看出在方法调用的时候会自己通过声明生成一个方法类型。
强行转型之后,类型就匹配了。?
|