【问题标题】:How to make Class.forName ignore lowercase/uppercase如何使 Class.forName 忽略小写/大写
【发布时间】:2009-09-23 13:27:08
【问题描述】:

例如,当我有一个名为的类时;

“猴子生意”

我知道我可以使用 Class.forName("MonkeyBusiness"); 来调用它

但是当我使用 Class.forName("monkeyBusiness"); 调用它时或 Class.forName("monkeybusiness"); 它给了我例外;

线程“主”java.lang.NoClassDefFoundError 中的异常:monkeyBusiness
(错误名称:ntx/gmd/services/usage/MonkeyBusiness)

是否可以使用任何大小写格式的字符串来调用它?如果有,怎么做?

【问题讨论】:

  • @Gerritt 是对的。您唯一的选择是以大写或小写形式命名所有类/包,然后在类名字符串上使用 String.toUpperCase() 或 String.toLowerCase(),但这几乎违反了所有 Java 编码约定:-P

标签: java class netbeans dynamic


【解决方案1】:

你没有。

Monkey Monkey 和 MONKEY 在 Java 中是三个完全不同的东西。

为什么需要这样的功能?根本问题可能是您不知道哪些类在您的应用程序中是相关的。

您可以做两件事。首先,有一个只使用小写或 CamelCase 类名的内部约定。这样,只需将您的搜索转换为适当的格式:Class.forName(className.toLowerCase())

其次,您可以对所有使用的类进行缓存,并从缓存中查找适当的名称。做个列表,小写名字为key,真名为value。

第三,但不推荐,蛮力检查所有组合。但这会为较长的名称创建一个非常糟糕的缩放函数:2^n,用于 n 长度的名称。

【讨论】:

    【解决方案2】:

    您可以编写一个忽略大小写的 ClassLoader。 Java ClassLoader 基本上只支持一个功能:客户端可以说“这是一个字符串,请加载具有该名称的类”,ClassLoader 要么回复“对不起,我不知道类”,要么“是的,这是班级”。 ClassLoader 如何实现这一行为完全取决于它的实现者。

    【讨论】:

    • 你有自定义类加载器的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多