用控制台控制类方法,实例方法,类变量,实例变量的使用
练习要求:用控制台控制类方法,实例方法,类变量,实例变量的使用
效果图如下所示:
控制台已启动,请输入合法信息:
信息须知:
1.调用类方法,通过输入[staticM]键,即静态方法按键
2.调用实例方法,通过输入[instanceM]键,即实例方法按键
3.调用实例变量,通过输入[instanceName]键,即实例变量按键
4.调用静态成员变量,通过输入[STATIC_AGE]键,即静态成员变量按键
5.通过[exit]或[退出]键退出程序!
staticM
这是一个静态方法!
instanceM
执行带参数的instanceM(实例)方法
内容:这是一个实例方法!
instanceName
实例变量的值:
null
设置指定实例变量的值:
小一
STATIC_AGE
VarHandle获取指定类变量的值:
0
输出User的MAX_AGE类变量
0
实现思路
通过扫描器,方法处理与变量处理的知识,用控制台来控制类方法,实例方法,类变量,实例变量的使用
实现步骤
- 获取扫描器对象
- 定义类方法,实例方法,类变量,实例变量
- 通过方法处理与变量处理的知识对类方法,实例方法,类变量,实例变量进行处理
- 测试程序
编码实现
package seven.six.exercise;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Scanner;
/**
* 用控制台控制类方法,实例方法,类变量,实例变量的使用<br>
* 2019年12月13日 下午1:58:41
*
* @author zcf
* @version 1.0
*/
public class Exercise {
/**
* 扫描器
*/
private static Scanner sc = new Scanner(System.in);
/**
* 类(staticM)方法
*/
@SuppressWarnings("unused")
public static void staticM() {
System.out.println("这是一个静态方法!");
}
/**
* 实例(InstanceM)方法
*
* @param instanceName 传入的参数
* @return 返回
*/
@SuppressWarnings("unused")
public String instanceM(String instanceContent) {
System.out.println("执行带参数的instanceM(实例)方法");
return instanceContent + ":这是一个实例方法!";
}
/**
* 程序入口
*
* @param args 入口参数
*/
public static void main(String[] args) {
System.out.println("控制台已启动,请输入合法信息:");
System.out.println("信息须知:\n 1.调用类方法,通过输入[staticM]键,即静态方法按键\n " + "2.调用实例方法,通过输入[instanceM]键,即实例方法按键\n "
+ "3.调用实例变量,通过输入[instanceName]键,即实例变量按键\n " + "4.调用静态成员变量,通过输入[STATIC_AGE]键,即静态成员变量按键\n "
+ "5.通过[exit]或[退出]键退出程序!");
// 判断是否有下一行输入
while (sc.hasNextLine()) {
try {
// 获取输入的内容
String content = sc.nextLine();
if (content.equals("exit") || content.equals("退出")) {
System.out.println("程序已结束");
break;
} else {
// 处理静态方法
if (content.equals("staticM")) {
// 定义一个返回值为void,不带形参的方法类型,void.class首字母小写
MethodType staticMethodType = MethodType.methodType(void.class);
// 使用MethodHandles.Lookup的findStatic获取类方法
MethodHandle methodHandle = MethodHandles.lookup().findStatic(Exercise.class, "staticM",
staticMethodType);
// 通过MethodHandle执行方法
methodHandle.invoke();
}
// 处理实例方法
else if (content.equals("instanceM")) {
// 定义一个返回值为void,不带形参的方法类型,void.class首字母小写
// 使用MethodHandles.Lookup的findVirtual获取实例方法
MethodHandle methodHandle2 = MethodHandles.lookup().findVirtual(Exercise.class, "instanceM",
// 指定获取返回值类型为String,形参为String的方法类型
MethodType.methodType(String.class, String.class));
// 通过MethodHandle执行方法,传入主调对象和参数
System.out.println(methodHandle2.invoke(new Exercise(), "内容"));
}
// 处理实例变量
else if (content.equals("instanceName")) {
// 用findVarHandle方法获取User类中名为name,类型为String的实例变量
java.lang.invoke.VarHandle varHandle2 = MethodHandles.lookup().findVarHandle(VarHandle1.class,
"instanceName", String.class);
VarHandle1 user = new VarHandle1();
// 通过VarHandle获取实例变量的值,需要传入对象作为调用者
System.out.println("实例变量的值:");
System.out.println(varHandle2.get(user));// 输出null
// 通过VarHandle设置指定实例变量的值
System.out.println("设置指定实例变量的值:");
varHandle2.set(user, "小一");
// 输出user的name实例变量的值
System.out.println(user.instanceName);
}
// 处理类变量
else if (content.equals("STATIC_AGE")) {
// 用findVarHandle方法获取User类中名为MAX_AGE,类型为int的类变量
java.lang.invoke.VarHandle varHandle3 = MethodHandles.lookup()
.findStaticVarHandle(VarHandle1.class, "STATIC_AGE", int.class);
System.out.println("VarHandle获取指定类变量的值:");
// VarHandle获取指定类变量的值
System.out.println(varHandle3.get());
System.out.println("输出User的MAX_AGE类变量");
// 输出User的MAX_AGE类变量
System.out.println(VarHandle1.STATIC_AGE);
} else {
System.out.println("输入信息不合法,请重新输入");
}
}
}
// 抓取异常
catch (Throwable e) {
// TODO: handle exception
System.out.println("信息错误");
StackTraceElement[] stackTraceElements = e.getStackTrace();
for (int i = 0; i < stackTraceElements.length; i++) {
System.out.println(stackTraceElements[i]);
}
continue;
}
}
}
}
/**
* 变量处理类<br>
* 2019年12月14日 上午9:42:15
*
* @author zcf
* @version 1.0
*/
class VarHandle1 {
/**
* 实例变量:名字
*/
String instanceName;
/**
* 静态变量:年龄
*/
static int STATIC_AGE;
}
以上,便是通过变量处理和方法处理,使用控制台控制类方法,实例方法,类变量,实例变量的实现过程,更多情况请自行检测!