Java 拓展读物 反射机制 05 应用举例
作者:谎言诞行    发布时间:2025年02月16日

前面花了4节的内容讲述了Java中的反射机制。当前我们以一个应答机器人为例子,如何在实际编程中使用这些技术。这个应答机器人功能很简单,就是你输入一个国家的名字,它就返回一句此国家的问候语。

(1)处理流程如下图:

image.png

(2)测试效果如下:

image.png

(3)特点总结

在我们的样例程序中,主要使用了类内方法的反射;它通过输入来构造要调用的具体方法。这样做的好处就是:不用单独写 if else 判断,也不用单独写 switch 来判断。因为可以直接反射到具体的函数,所以我们只需要在类内部按照一定的规则来编写的方法名即可。总的来说,反射的处理还是可以节省很多判断的代码。

(4)机器人参考代码如下:

package net.mickarea.reflection;

/**
 * 这是一个人工智能的应答机器人(有多少人工,就有多少智能)
 * @author Michael Pang (Dongcan Pang)
 * @version 1.0
 * @since 2025年02月16日
 */
public class MyRobot {

	public String fromChina() {
		return "你好!欢迎来到 PDC 的 AI 世界!";
	}
	
	public String fromAmerica() {
		return "Hello! Welcome to PDC's World of AI !";
	}
	
	public String fromJapan() {
		return "こんにちは!PDCのAIの世界へようこそ!";
	}
	
}

 (5)主程序参考代码如下:

package net.mickarea.reflection;

import java.lang.reflect.Method;
import java.util.Scanner;
import java.util.regex.Pattern;

/**
 * 这是一个使用反射机制实现动态应答的样例
 * @author Michael Pang (Dongcan Pang)
 * @version 1.0
 * @since 2025年02月16日
 */
public class MyDemo {
	public static void main(String[] args) {
		
		//定义一个扫描器,用于接收键盘输入
		Scanner scaner = new Scanner(System.in);
		
		//定义一个问答机器人
		MyRobot robot = new MyRobot();
		
		// 一直循环,直到获取到退出的操作
		while(true) {
			//输出提示信息
			System.out.println("Robot-001: Hi. Where are you from ? (Enter 'quit' to exit.)");
			//获取键盘输入
			String info = scaner.next();
			//如果输入的是 quit 则退出
			if("quit".equalsIgnoreCase(info)) {
				System.out.println("Robot-001: Goodbye !");
				scaner.close();
				System.exit(0);
			}
			//如果是其它内容,则开始问答。(空白内容过滤)
			if(Pattern.matches("\\s+", info)) {
				System.out.println("Robot-001: Nothing was received. Please try again.");
				continue;
			}
			//构建要反射的方法名(去掉空白字符,然后转小写)
			String methodName = info.replaceAll("\\s+", "").toLowerCase();
			//首字母转大写
			methodName = methodName.substring(0, 1).toUpperCase()+methodName.substring(1);
			//拼接方法前缀
			methodName = "from"+methodName;
			//开始反射处理
			try {
				//获取要执行的方法对象
				Method method = robot.getClass().getDeclaredMethod(methodName);
				//执行(获取机器人所回答的内容)
				String answer = (String)method.invoke(robot);
				//输出
				System.out.println("Robot-001: "+answer+".");
				
			} catch (NoSuchMethodException e) {
				System.out.println("Robot-001: I'm sorry, I can't speak the language of this country.");
				continue;
			} catch (Exception e) {
				System.out.println("Robot-001: Some runtime exception was found. >>> "+e.getMessage());
				System.out.println("Robot-001: Bye !");
				scaner.close();
				System.exit(-1);
			}
		}
	}
}


本节完结


填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新