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

Java 如何从动态实现接口的类中获取方法?,java,reflection,Java,Reflection,我正在用Java开发一个简单的2D游戏。有两个机器人:它们可以移动、战斗等。。这些类实现相同的接口 问题是: 如何在运行时实例化机器人?我的意思是,当程序运行时,要求用户加载类,然后使用他们的方法(按1获得自己的盾点数…)就像角色扮演游戏一样。。我尝试使用反射,但在界面上不起作用 我的思考方法: 机器人1级: 此外,Arena类存储游戏板信息,如竞技场大小、打印等。。。如果我想在这个竞技场上操作(移动机器人对象[1][1]-->[3][2]),如何将机器人界面和竞技场相互连接 在哪里存放他们的位

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

问题是

  • 如何在运行时实例化机器人?我的意思是,当程序运行时,要求用户加载类,然后使用他们的方法(按1获得自己的盾点数…)就像角色扮演游戏一样。。我尝试使用反射,但在界面上不起作用

    我的思考方法:

    机器人1级:

  • 此外,Arena类存储游戏板信息,如竞技场大小、打印等。。。如果我想在这个竞技场上操作(移动机器人对象[1][1]-->[3][2]),如何将机器人界面和竞技场相互连接

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

  • 像这样
  • 公共机器人loadByClassName(字符串classname){
    类装入类;
    试一试{
    loadClass=Class.forName(classname);
    返回(Robot)loadClass.getConstructor().newInstance();
    }捕获(例外e){
    //TODO自动生成的捕捉块
    e、 printStackTrace();
    }
    返回null;
    }
    
  • 不太可能,也许你可以用x和y属性创建一个类位置

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

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


  • 你不能直接用Java实例化接口,而你的机器人是一个接口。你应该使用你的实现Robot1类。我知道,我的问题集中在反射上。你的问题不集中在反射上,你的问题是“如何动态实例化接口?”答案是你不能实例化接口。那么你的问题对于这个网站来说太广泛了,因为你一次问了多个问题。请看一下,如果您确实正确加载了实现类,那么不清楚调用接口方法时遇到了哪些问题。它应该以两种方式工作,通过直接转换到接口类型或通过反射。请注意,
    this.getClass().getClassLoader().loadClass(classname)
    在大多数情况下是过时的,因为您可以简单地使用使用调用方的类加载器的
    Class.forName(classname)
    。只有当类的子类由不同的类装入器装入时,才会出现差异。
    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();
        }
    }
    
    public interface Robot {
    
        public String getPosition();
    
        public String getEnemyPosition();
    
        public String getArenaSize();
    
        public int getShield();
    
    }
    
    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;
        }
    }
    
    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;
    
    }