将 class 作为参数传递给方法,然后调用静态方法
Passing a class as argument to a method, then calling static methods
我有一个用例 class 存在于一个包的两个版本中。
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";
}
}
到目前为止一切顺利(我相信)。
然后我有一个使用 class 的应用程序,为了避免为不同的包版本重写应用程序,我想传递应该使用的 class (即用于包利息)作为申请的论据。
所以像
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)
。
我觉得太复杂了。
或者有更好的设计吗?
以这种方式使用静态方法不是一个好的设计,也不符合面向对象的原则。
我的建议是尝试将“example()”更改为常规方法,而不是静态方法。
@javadev 是对的。使用反射几乎总是一个非常糟糕的主意。这就是复杂化的原因。
这里就不用反思了。在实例上调用静态方法的能力很快就被认为是一个设计错误。如此之多,以至于随后出现了高度非正交的设计选择,因为它不适用于作为接口成员的静态方法。
简单的解决方案是将静态方法移动到无状态对象的实例方法。不需要 Class
或其他反射。这是策略设计模式的应用。
我有一个用例 class 存在于一个包的两个版本中。
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";
}
}
到目前为止一切顺利(我相信)。
然后我有一个使用 class 的应用程序,为了避免为不同的包版本重写应用程序,我想传递应该使用的 class (即用于包利息)作为申请的论据。 所以像
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)
。
我觉得太复杂了。
或者有更好的设计吗?
以这种方式使用静态方法不是一个好的设计,也不符合面向对象的原则。
我的建议是尝试将“example()”更改为常规方法,而不是静态方法。
@javadev 是对的。使用反射几乎总是一个非常糟糕的主意。这就是复杂化的原因。
这里就不用反思了。在实例上调用静态方法的能力很快就被认为是一个设计错误。如此之多,以至于随后出现了高度非正交的设计选择,因为它不适用于作为接口成员的静态方法。
简单的解决方案是将静态方法移动到无状态对象的实例方法。不需要 Class
或其他反射。这是策略设计模式的应用。