在Java中获取Class的部分名称

时间:2012-03-01 09:08:14

标签: java reflection

好的,所以我正在尝试使用类在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中执行此操作,如果是这样,如何?如果没有,您建议采用什么方法处理我的网络数据包?

3 个答案:

答案 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建议明确拥有映射表。