好的,所以我正在尝试使用类在Java中进行网络数据包处理。为了从我的流中读取数据,我使用DataInputStream。我的服务器的阅读线程如下:
public void run()
{
while(client.isActive())
{
try{
handle(is.readShort());
}catch (IOException e){
client.stop(e);
break;
}
}
}
现在我有一个方法句柄:
public void handle(short id) throws IOException
{
InPacket packet = null;
try {
packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id);
}catch (Exception e){
e.printStackTrace();
}
if (packet!=null){
packet.handle(this);
}
else{
throw new IOException("Invalid packet");
}
}
我尝试使用
实例化一个新类packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id);
线。
在ClassUtils中,这就是那个函数:
public static <T> T newInstance(Class<? extends T> type, String className) throws
ClassNotFoundException,
InstantiationException,
IllegalAccessException {
Class<?> clazz = Class.forName(className);
Class<? extends T> targetClass = clazz.asSubclass(type);
T result = targetClass.newInstance();
return result;
}
我的问题是:当我尝试仅使用部分名称获取该类时(我尝试通过“InPacket1”获取它,而该类称为“InPacket1Connect”),它可以找不到它。是否有可能在Java中执行此操作,如果是这样,如何?如果没有,您建议采用什么方法处理我的网络数据包?
答案 0 :(得分:0)
像这样,也许?
packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id+"Connect");
^^^^^^^^^^
(但我可能误解了你的问题)
答案 1 :(得分:0)
另一种方法是使用将id映射到完整类名的map(或枚举)。
从注释中提取内容,确保此映射类可用作jar(或可能在包含数据包处理程序实现的同一jar中)作为“消息传递层”jar。
答案 2 :(得分:0)
为什么不能创建完整的班级名称?
packet = ClassUtils.newInstance(InPacket.class, "server.client.InPacket"+id + "Connect"
您可以通过编写自己的类加载器来实现您似乎要求的功能 - 一种“模糊”类名匹配。类加载器可以在某些目录中搜索与该类型部分匹配的类文件。
我的感觉是,这可能是一个脆弱的解决方案,存在加载意外类的危险。如果你不能使用algorthimic classname生成器,我更喜欢Nim建议明确拥有映射表。