【发布时间】:2019-06-11 19:30:46
【问题描述】:
当然,我做过一些研究,比如包扫描、java 的反射、gson 等等。
我想要什么?
我想随机获取一些实例,但将此部分代码保留在子类中。
因此,每个子类都应该有一个名为SuperClass nextInstance() 的方法。
如果我通过反射得到子类列表,比如classes,我只需要为classes 中的每个元素调用nextInstance。
刚刚完成。
但是,我需要为每个子类添加静态方法,并且名称必须是nextInstance,真是愚蠢!!!
我为什么要这样做。
我需要运行一个庞大的测试项目。 每个子类都有自己的参数(它是随机的)。 我想隐藏参数设置。 同事不需要关心参数是什么。 他们只需要关心自己的代码。 我认为实现它的唯一方法是从 superClass 扩展一个方法。
我已经做了什么。
- 为每个人创建一个工厂类(太麻烦)。
- 在 List 中添加子类路径以在运行时加载它们(难以维护)。
- 通过反射尝试抽象静态方法(在 java 中是不可能的)。
- 等等(可能是,我放弃了)
示例
Abstract class SuperClass{
// I know it is impossible in java, but just explain what I mean.
public static abstract SuperClass nextInstance();
}
class SubClassA extend SuperClass{
private double params;
public SuperClass(double parmas){
this.params = params;
}
public static SuperClass nextInstance(){
return new SubClassA(r.nextDouble()+4);
}
}
class SubClassB extend SuperClass{
private int params;
public SuperClass(int parmas){
this.params = params;
}
public static SuperClass nextInstance(){
return new SubClassB(r.nextInt(20)+4);
}
}
class Main{
public static void main(String[] args){
List<Class> classes.....// get classes extend from SuperClass by reflection.
List<SuperClass> res = new ArrayList<>();
for(Class c:classes){
res.add(c.nextInstance())
}
// do something on each element in res.
}
}
更新
我认为我需要更简单地重新解释我想要做什么。
如果有人用过slfjLoggerFactory.getLogger(Class c),那就更容易理解了。
对我来说,我需要实现一个类似Factory.getInstance(Class c)的方法,这个方法中的代码会调用c.nextInstance();
有什么建议吗?
【问题讨论】:
-
从你目前的情况退后一步,首先请解释你想要达到的目标。你想对一个类的每个实例做什么?
-
@Lino 已经更新
-
能否提供minimal reproducible example。目前还不清楚您要实现的目标
-
不要在
src/main/java中的类中构建测试方法,而是将测试内容放在src/test/java中并将其应用到您的类中。除此之外,很难理解您要做什么。 -
@Lino Emmm... 清楚吗?
标签: java reflection package