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

时间:2018-05-29 11:30:02

标签: java reflection

我正在研究Java中的简单2D游戏。有2个机器人:他们可以移动,战斗等。这些类实现相同的界面。

问题

  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 ()的好方法吗?

  3. 机器人界面:

    public interface Robot {
    
        public String getPosition();
    
        public String getEnemyPosition();
    
        public String getArenaSize();
    
        public int getShield();
    
    }
    

    Robot1类:

    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] ---&gt; [3] [ 2])如何将Robot界面和Arena相互连接?

    2. 在哪里存放他们的职位(在具体课程或其他地方)?聚合是最好的方法吗?如何避免紧耦合?

1 个答案:

答案 0 :(得分:0)

  1. 喜欢这个
  2. 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.)和价值机器人将是我的方法