基类
package methodhandle;
public class HandleTarget {
public String name = "hello world";
public HandleTarget() {
}
public HandleTarget(String name) {
this.name = name;
}
public void connectName(String name) {
this.name = this.name + " " + name;
}
public String getName() {
return name;
}
private void learnPrograming(String lang) {
System.out.println(String.format("I am learning %s ", lang));
}
public static String declaration(String author) {
return author + ": " + "吾生也有涯,而知也无涯。以有涯随无涯,殆己";
}
@Override
public String toString() {
return "HandleTarget{" +
"name='" + name + '\'' +
'}';
}
}
测试类
package methodhandle;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class HandleTargetTest {
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
System.out.println("---无参数构造---");
MethodType con1Mt = MethodType.methodType(void.class);
MethodHandle constructor = lookup.findConstructor(HandleTarget.class, con1Mt);
Object target1 = constructor.invoke();
System.out.println(target1);
System.out.println("---有参数构造--");
MethodType methodType = MethodType.methodType(void.class, String.class);
MethodHandle constructor1 = lookup.findConstructor(HandleTarget.class, methodType);
Object target2 = constructor1.invoke("toDay");
System.out.println(target2);
System.out.println("---访问非private实例方法---");
MethodType getterMt = MethodType.methodType(String.class);
MethodHandle getName = lookup.findVirtual(HandleTarget.class, "getName", getterMt);
String name = (String) getName.invoke(target2);
System.out.println(name);
System.out.println("---访问private实例方法---");
Method learnMethod = HandleTarget.class.getDeclaredMethod("learnPrograming", String.class);
learnMethod.setAccessible(true);
MethodHandle learnProMh = lookup.unreflect(learnMethod);
learnProMh.invoke(target1, "Java");
System.out.println("---访问非private 静态方法---");
MethodType methodType1 = MethodType.methodType(String.class, String.class);
MethodHandle declaration = lookup.findStatic(HandleTarget.class, "declaration", methodType1);
Object zuanzi = declaration.invoke("钻子");
System.out.println(zuanzi);
System.out.println("---访问 getter 方法---, 私有属性必须是public修饰");
System.out.println("---访问private属性---");
Field nameField = HandleTarget.class.getDeclaredField("name");
nameField.setAccessible(true);
MethodHandle nameFromRefMh = lookup.unreflectGetter(nameField);
System.out.println((String) nameFromRefMh.invoke(target1));
System.out.println("---增强MethodHandle---");
MethodType methodType2 = MethodType.methodType(void.class, String.class);
MethodHandle setterMh = lookup.findVirtual(HandleTarget.class, "connectName", methodType2);
MethodHandle bindedSetterMh = setterMh.bindTo(target2);
bindedSetterMh.invoke("love love ");
System.out.println((String) getName.invoke(target2));
}
}