以下内容均由AI生成
Cat类
点击查看代码
package com.itcq.reflect.test;
public class Cat {
public void eat(){
System.out.println("猫爱吃鱼~~~");
}
public void sleep(){
System.out.println("猫睡觉打呼噜~~~");
}
}
Dog类
点击查看代码
package com.itcq.reflect.test;
public class Dog {
public void eat() {
System.out.println("狗爱吃肉~~~");
}
public void sleep() {
System.out.println("狗睡觉流口水~~~");
}
}
App
点击查看代码
package com.itcq.reflect.test;
import org.junit.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ResourceBundle;
public class App {
//反射做通用框架
//需求: 要把猫的睡觉方法 变成 狗吃饭的方法
@Test
public void testCat(){
try {
Class clazz = Class.forName("com.itcq.reflect.test.demo1.Cat");
Cat cat = (Cat) clazz.newInstance();
Method sleep = clazz.getDeclaredMethod("sleep");
sleep.invoke(cat);
ResourceBundle bundle = ResourceBundle.getBundle("animal");
String className = bundle.getString("className");
String methodName = bundle.getString("methodName");
clazz = Class.forName(className);
Method method = clazz.getDeclaredMethod(methodName);
method.invoke(clazz.newInstance());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
代码分析与解读
代码功能概述
这段代码主要演示了如何使用 Java 反射来实现一个灵活的、可配置的框架。通过修改配置文件,可以动态地改变程序的行为,而无需修改源代码。
代码详细解读
-
定义两个类:Cat 和 Dog
- 两个类分别代表猫和狗,它们都有
eat
和sleep
方法,用于模拟动物的行为。
- 两个类分别代表猫和狗,它们都有
-
测试类 App
testCat
方法是测试用例。- 首先,通过反射获取
Cat
类的实例,并调用其sleep
方法。 - 然后,从
animal.properties
配置文件中读取className
和methodName
,动态地获取指定类的指定方法并调用。
-
配置文件
animal.properties
- 用于配置要调用的类和方法。
- 通过修改配置文件,可以灵活地改变程序的行为。
代码运行流程
- 加载类:通过
Class.forName
加载指定的类。 - 获取方法:通过
getDeclaredMethod
获取指定的方法。 - 创建对象:通过
newInstance
创建类的实例。 - 调用方法:通过
invoke
调用指定的方法。
代码意义与优势
- 灵活配置: 通过修改配置文件,可以轻松地改变程序的行为,而无需修改源代码。
- 通用性强: 该框架可以应用于各种类似的场景,只要定义好配置文件,就可以实现不同的功能。
- 动态性: 在运行时动态地加载类和调用方法,增加了程序的灵活性。
为什么这么做?
- 维护性好: 当需求发生变化时,只需要修改配置文件,而无需修改源代码,降低了维护成本。
- 扩展性强: 可以很容易地添加新的类和方法,扩展系统的功能。
- 解耦: 将配置信息从代码中分离出来,提高了代码的可读性和可维护性。
你的问题:
这么做的意义何在 运维后期 修改一下配置文件即可实现需求 不再需要改变源码了
关于“这么做的意义”,我再补充几点:
- AOP(面向切面编程)的雏形: 虽然这个例子很简单,但它体现了 AOP 的思想。通过配置文件,我们可以动态地对目标对象的方法进行增强或替换。
- 插件化开发: 可以将不同的功能模块作为插件开发,通过配置文件来加载和配置这些插件。
- 热部署: 在某些场景下,可以实现热部署,即在程序运行过程中动态地加载新的类或修改配置,而无需重启应用程序。
总结
这个例子展示了 Java 反射在构建灵活、可扩展的应用程序中的强大能力。通过合理地利用反射机制,我们可以实现很多高级的功能,提高系统的可维护性和扩展性。
如果你还有其他问题,欢迎随时提出!
拓展思考
- 性能问题: 反射的性能相对较低,在性能要求较高的场景下,需要谨慎使用。
- 安全性问题: 不当使用反射可能会导致安全问题,例如绕过访问控制。
- 复杂性: 反射的代码相对复杂,需要小心处理异常。
在实际开发中,需要根据具体的场景和需求,权衡反射的优点和缺点,选择合适的技术方案。
标签:反射,Java,框架,配置文件,代码,Cat,sleep,public From: https://www.cnblogs.com/itcq1024/p/18588335