【问题标题】:Calling a method and making object of an unknown class in Java在Java中调用方法并制作未知类的对象
【发布时间】:2013-06-03 21:35:57
【问题描述】:

我在返回并添加到我的游戏的主循环时遇到了问题,如果我可以从我不知道的类创建对象,这个任务将被取消。

现在我有:

if (Monesers.Zombie.canBeCreated(world,objects)){
    Zombie.add(new Monster())
}

if (Monesers.Sceleton.canBeCreated(world,objects)){
    objects.add(new Monster())
}

我正在寻找可以循环到所有类而不提及类名称的东西,这样我就不必为游戏中的每个新事物一遍又一遍地复制相同的代码。

【问题讨论】:

  • 我不太清楚。你能更清楚地描述你想要什么吗
  • 你需要的可能是反思,虽然你的问题有点模糊......
  • @NilsH 我添加了更多细节
  • 我同意你应该告诉更多,包括这种愿望背后的理由。我担心这真的是XY problem,你可能没有问正确的问题。
  • 您仍然只提供了一些神秘的信息,并没有讲述更完整的故事。我担心你在这一切都错了,但更糟糕的是,你的问题不够清晰,很快就会结束。请讲述整个的故事。请出示相关代码。

标签: java class object package


【解决方案1】:

反射会带你到某个地方...不过我不知道它是否是首选方法。

你可以做这样的事情。让每个怪物类型实现一个接口,如下所示:

public interface Monster {

    public boolean canBeCreated ( );

}

然后你可以有一个怪物创造者,像这样:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class MonsterCreator {

    private Monster[] monsterTypes;

    public MonsterCreator ( ) {
        monsterTypes = new Monster[2];
        monsterTypes[0] = new Zombie ( );
        monsterTypes[0] = new Skeleton ( );
    }

    public void tick ( ) {
        for ( Monster m : monsterTypes ) {
            if ( m.canBeCreated ( ) ) {
                try {
                    Constructor< ? >[] constr = m.getClass ( )
                        .getConstructors ( );
                    Monster toAdd = ( Monster ) constr[0].newInstance ( );
                    MonsterContainer.add ( toAdd );
                } catch ( InstantiationException | IllegalAccessException
                    | IllegalArgumentException | InvocationTargetException e ) {
                    e.printStackTrace ( );
                }
            }
        }
    }

}

值得一试... :)

当然,怪物类型的事情可以通过类似链接到类类型的枚举常量映射来更简洁地完成......再次,这只是为了示例。只是想在问题结束之前发布此内容!

【讨论】:

  • 不完全是我所期待的,它比以前更好!
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多