有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从动态实现接口的类中获取方法?

我正在用Java开发一个简单的2D游戏。有两个机器人:它们可以移动、战斗等。。这些类实现相同的接口

问题是

  1. 如何在运行时实例化机器人?我的意思是,当程序运行时,请用户加载类,然后使用它们的方法(按1获得自己的屏蔽点..)就像一个角色扮演游戏。。我试着使用反射,但在界面上不起作用

    我的反思方法:

    public void invokeClassMethod(String classBinaryName, String methodName) {
    
        try {
            ClassLoader classLoader = this.getClass().getClassLoader();
            Class<?> loadClass = classLoader.loadClass(classBinaryName);
    
            System.out.println("Loaded class name: " + loadClass.getName());
    
            Constructor<?> constructor = loadClass.getConstructor();
            Object classObject = constructor.newInstance();
    
            Method method = loadClass.getMethod(methodName);
            System.out.println("Invoked method name: " + method.getName());
            method.invoke(classObject);
    
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
  2. 这是获得enemyPosition的好方法吗

机器人界面:

public interface Robot {

    public String getPosition();

    public String getEnemyPosition();

    public String getArenaSize();

    public int getShield();

}

机器人1类:

public class Robot1 implements Robot {

    private int xCurrent;
    private int yCurrent;
    private int shield;
    private final int attack = 1;

    Robot robot2;

    public Robot1() {
    }

    public Robot1(int x, int y, int shield, Robot robot2) {
        this.xCurrent = x;
        this.yCurrent = y;
        this.shield = shield;
        this.robot2 = robot2;
    }

    @Override
    public String getPosition() {
        return "x: " + xCurrent + " y: " + yCurrent;
    }

    @Override
    public String getEnemyPosition() {
        return robot.getPosition();
    }

    @Override
    public int getShield() {
        return shield;
    }
}
  1. 此外,Arena类存储游戏板信息,如竞技场大小、打印等。。。如果我想在这个竞技场上操作(移动机器人对象[1][1]-->;[3][2]),如何连接机器人界面和竞技场

  2. 在哪里存放他们的位置(在混凝土类或其他地方)?聚合是最好的方法吗?如何避免紧密耦合


共 (1) 个答案

  1. # 1 楼答案

    1. 像这样
    public Robot loadByClassName(String classname) {
        Class<?> loadClass;
        try {
            loadClass = Class.forName(classname);
            return (Robot) loadClass.getConstructor().newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    
    }
    
    1. 不太可能,也许你可以用x和y属性创建一个班级职位

    2. 我认为竞技场物体应该容纳竞技场中的物体(你的机器人)

    3. 竞技场的地图和关键位置(见2。)而价值机器人将是我的方法