用控制台控制类方法,实例方法,类变量,实例变量的使用

用控制台控制类方法,实例方法,类变量,实例变量的使用

练习要求:用控制台控制类方法,实例方法,类变量,实例变量的使用

效果图如下所示:

控制台已启动,请输入合法信息:
信息须知:
1.调用类方法,通过输入[staticM]键,即静态方法按键
2.调用实例方法,通过输入[instanceM]键,即实例方法按键
3.调用实例变量,通过输入[instanceName]键,即实例变量按键
4.调用静态成员变量,通过输入[STATIC_AGE]键,即静态成员变量按键
5.通过[exit]或[退出]键退出程序!
staticM
这是一个静态方法!
instanceM
执行带参数的instanceM(实例)方法
内容:这是一个实例方法!
instanceName
实例变量的值:
null
设置指定实例变量的值:
小一
STATIC_AGE
VarHandle获取指定类变量的值:
0
输出User的MAX_AGE类变量
0

实现思路

通过扫描器,方法处理与变量处理的知识,用控制台来控制类方法,实例方法,类变量,实例变量的使用

实现步骤

  1. 获取扫描器对象
  2. 定义类方法,实例方法,类变量,实例变量
  3. 通过方法处理与变量处理的知识对类方法,实例方法,类变量,实例变量进行处理
  4. 测试程序

编码实现

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;
}

以上,便是通过变量处理和方法处理,使用控制台控制类方法,实例方法,类变量,实例变量的实现过程,更多情况请自行检测!

发布了4 篇原创文章 · 获赞 6 · 访问量 125

猜你喜欢

转载自blog.csdn.net/zcf_hrkj/article/details/103537332