Passing a class as argument to a method, then calling static methods(将类作为参数传递给方法,然后调用静态方法)
问题描述
我有一个使用案例,其中一个类存在于包的两个版本中。
package packageV1;
public class MyClass extends BaseClass{
public static String example(){
return "Version1";
}
}
package packageV2;
public class MyClass extends BaseClass{
public static String example(){
return "Version2";
}
}
到目前为止(我相信)还不错。 然后,我有一个使用该类的应用程序,为了避免为不同的包版本重写应用程序,我希望将应该使用的类(即,用于感兴趣的包)作为参数传递给该应用程序。 所以类似于
public class Application{
private Class<BaseClass> selectedClass;
public void Application(Class<BaseClass> selectedClass){
this.selectedClass = selectedClass;
this.selectedClass.example(); // not possible
}
}
我相信如果我在构造函数中传递MyClass
的实例,我可以调用this.selectedClass.example();
,但然后我会通过实例对象调用静态方法,这不是很好吗?
另一方面,在上面的示例中,selectedClass
是一个Class对象,所以我不能像上面那样调用静态方法example
。
这是否意味着我应该使用反射?如selectedClass.getMethod(name, parameterTypes)
。
在我看来太复杂了。
还是有更好的设计?
推荐答案
@javadev是对的。使用反射几乎总是一个非常糟糕的主意。这是一个过于复杂的问题。
这里不需要反思。在实例上调用静态方法的能力很快被意识到是一个设计错误。以至于有了后续的高度非正交性设计选择,因为它不适用于作为接口成员的静态方法。
简单的解决方案是将静态方法移动到无状态对象的实例方法。不需要Class
或其他反射。这是策略设计模式的应用。
这篇关于将类作为参数传递给方法,然后调用静态方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将类作为参数传递给方法,然后调用静态方法


- Eclipse 插件更新错误日志在哪里? 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01