MethodHandle与VarHandle练习题
作业要求:在控制台实现,实例方法,类变量,实例变量的使用
实现代码如下
public class Method {
/**
* 名字
*/
private static String name = "王留闯";
/**
* 年龄
*/
private int age = 18;
/**
* 获取名字的方法
*
* @return 名字
*/
private static String getName() {
return "我的名字是:" + name;
}
/**
* 获取年龄的方法
*
* @return 年龄
*/
private String getAge() {
return "我的年龄是:" + age;
}
/**
* 程序入口
*
* @param args 入口参数
* @throws Throwable 抛出异常
*/
public static void main(String[] args) throws Throwable {
// 获取扫描器输入流
Scanner sc = new Scanner(System.in);
System.out.println("退出程序请输入:exit | 退出 \n清输入变量名或方法名进行查询");
// 判断是否有下一行输入
while (sc.hasNextLine()) {
// 获取下一行输入
String currentString = sc.nextLine();
if (currentString.equals("exit") || currentString.equals("退出")) {
break;
}
MethodAddVarHandle(currentString);
}
System.out.println("程序退出");
}
/**
* 打印输入
*
* @param obj 传入输入
*/
private static void println(Object obj) {
System.out.println("查询结果:" + obj);
}
/**
* 该方法用于查找变量以及方法
*
* @param methodAddvar 传入名字
* @throws Throwable 抛出异常
*/
private static void MethodAddVarHandle(String methodAddvar) throws Throwable {
// 创建一个该类对象,用于匹配非静态成员
Method method = new Method();
switch (methodAddvar) {
case "name":
// 用于匹配name的变量
VarHandle varHandle = MethodHandles.lookup().findStaticVarHandle(Method.class, methodAddvar, String.class);
println(varHandle.get());
break;
case "age":
// 用于匹配age的变量
VarHandle varHandle2 = MethodHandles.lookup().findVarHandle(Method.class, methodAddvar, int.class);
println(varHandle2.get(method));
break;
case "getName":
// 用于匹配getName的方法
MethodHandle methodHandle = MethodHandles.lookup().findStatic(Method.class, methodAddvar,
MethodType.methodType(String.class));
println(methodHandle.invoke());
break;
case "getAge":
// 用于于匹配getAge的方法
MethodHandle methodHandle2 = MethodHandles.lookup().findVirtual(Method.class, methodAddvar,
MethodType.methodType(String.class));
println(methodHandle2.invoke(method));
break;
default:
// 未匹配到该类的变量或方法
System.out.println("为找到该变量名或方法名");
break;
}
}