这是一个奇怪的问题。我有一个方法,使用java反射使用一组类填充列表。
import org.reflections.Reflections;
...
Reflections reflections = new Reflections("network.packet");
Class<?>[] packets = new Class<?>[256];
for (Class<?> c : reflections.getSubTypesOf(Packet.class))
{
try {
byte opcode = ((Packet)c.newInstance()).getOpcode();
packets[opcode] = c;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
GetOpcode返回一个字节,向数据包注册一个字节。我想知道我是否可以通过提供操作码映射的自动解决方案来使我的代码更加API友好。目前我在扩展Packet的类中强制调用超级构造函数,并使用字节注册操作码。
setOpcode(byte num)
为此类设置操作码。
我的问题在于我是否可以信任org.reflection在每台机器上每次运行相同的方式来计算代码,而不是让它们硬编码,并使API的用户不会踩到已有的代码
那么,有人知道吗?
答案 0 :(得分:1)
org.reflections不计算代码 - 您只是使用它来迭代提供代码的{{1}}子类型。
只要您的所有Packet
扩展程序都在类路径上(并且它们都提供了适合该数组的唯一代码),那么您就可以了。
至于更好的方式&#34; - 你可以考虑注册&#34;机制(即:将
>将数据包类推送到注册表中)而不是&#34;发现&#34;您现在正在使用的机制(即:从类路径中提取数据包类) - 它是否更好取决于您的最终用例。