Java 如何从动态实现接口的类中获取方法?
我正在用Java开发一个简单的2D游戏。有两个机器人:它们可以移动、战斗等。。这些类实现相同的接口 问题是:Java 如何从动态实现接口的类中获取方法?,java,reflection,Java,Reflection,我正在用Java开发一个简单的2D游戏。有两个机器人:它们可以移动、战斗等。。这些类实现相同的接口 问题是: 如何在运行时实例化机器人?我的意思是,当程序运行时,要求用户加载类,然后使用他们的方法(按1获得自己的盾点数…)就像角色扮演游戏一样。。我尝试使用反射,但在界面上不起作用 我的思考方法: 机器人1级: 此外,Arena类存储游戏板信息,如竞技场大小、打印等。。。如果我想在这个竞技场上操作(移动机器人对象[1][1]-->[3][2]),如何将机器人界面和竞技场相互连接 在哪里存放他们的位
公共机器人loadByClassName(字符串classname){
类装入类;
试一试{
loadClass=Class.forName(classname);
返回(Robot)loadClass.getConstructor().newInstance();
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回null;
}
你不能直接用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;
}