java获取继承类_java – 获取继承其中一个的第三方类的实例

所以情况就是这样:我正在创建一个多人游戏,我希望我的朋友……,能够为它创建机器人.所以我要做的是创建一个抽象类Bot {},并为机器人定义函数,然后他们必须实现它们:非常简单.

我被卡住了,之后如何添加它们?您可以使用反射或类似的东西来找到Bot的所有继承者吗?或者我是否需要搜索.jar文件?

到目前为止,这是我如何做到的(简化,类不在同一个文件中等):

abstract class Bot{

public int play();

//...

}

class Bot1 extends Bot{

@override

public int play(){/*do stuff*/}

//...

}

然后当我需要每个机器人之一:

ArrayList bots = new ArrayList<>();

bots.add(new Bot1());

//...

我的问题是,如果我要使用它,因为Bot1 instanciation是硬编码的,我需要允许人们修改我的代码来添加他们自己的机器人 – 我不想要.

我的问题是,如果不进行硬编码,我怎样才能做到这一点?我知道这是可能的,因为Minecraft做到了(mods等),但我不知道如何做到这一点.到目前为止,我的研究没有给我任何结果(可能是因为我不知道如何用一个简单的句子解释这个…),所以欢迎任何提示的线索,以及学习如何做到这一点的地方.

另外,我对OOP有很好的理解,但是我对于反射和getClass()事情都是新手……

解决方法:

最简单的方法(没有任何外部框架)可能是将Bot定义为接口(SPI,服务提供者接口),然后使用JRE附带的内置Service Loader机制.然后需要部署自定义Bot实现(作为JAR),以便可以在应用程序的类路径中访问它们.

所以,像:

SPI合约:

public interface Bot {

int play();

}

实现(这需要打包到一个JAR中,该JAR具有链接文档中指定的目录结构,包括META-INF文件夹):

public class MyBot implements Bot {

@Override

public int play() {

// do something

}

}

抬头:

import java.util.ServiceLoader;

public class BotResolver {

private final ServiceLoader loader;

public BotResolver() {

loader = ServiceLoader.load(Bot.class);

}

/**

* Gets all bot implementations that are currently available in the classpath.

*/

public List getAllBots() {

List allBots = new ArrayList<>();

Iterator it = loader.iterator();

while (it.hasNext()) {

allBots.add(it.next());

}

return allBots;

}

}

标签:java,oop,inheritance

来源: https://codeday.me/bug/20190722/1501680.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值