创建文件名不区分大小写的java类实例
目前我有以下方法来实例化对象。我正在从一个文件中读取类名及其大写形式。(我可以假设不会有很多类,如创建文件名不区分大小写的java类实例,java,string,naming-conventions,Java,String,Naming Conventions,目前我有以下方法来实例化对象。我正在从一个文件中读取类名及其大写形式。(我可以假设不会有很多类,如Abc.java、Abc.java或Abc.java,并且只有一个类的名称按给定顺序包含a、b、c字母) 例如,有一个名为SchoolPrincipal的java类,该类在文件中表示为SchoolPrincipal,因此由于大写问题,当前我的以下方法找不到该对象,它给出了ClassNotFoundException 我不能重命名java类,它应该保持标准,并且也不能更改文件中大写的单词。有没有一个棘
Abc.java
、Abc.java
或Abc.java
,并且只有一个类的名称按给定顺序包含a、b、c字母)
例如,有一个名为SchoolPrincipal
的java类,该类在文件中表示为SchoolPrincipal
,因此由于大写问题,当前我的以下方法找不到该对象,它给出了ClassNotFoundException
我不能重命名java类,它应该保持标准,并且也不能更改文件中大写的单词。有没有一个棘手的方法来解决这个问题
我有一个解决方案,我想知道这个方案的好坏,
获取所有java类的名称并存储在一个映射中,其中键都是大写的(键:CLASSTEACHER,值:CLASSTEACHER)
,当我从文件中读取名称时,我在映射中搜索它,获取值并将类名传递给下面的方法
public Object getInstance(String packageName, String className)
String unifiedClassName = packageName + "." + className;
LOG.info("Creating " + unifiedClassName + " instance...");
Class<?> clazz = null;
Constructor<?> ctor = null;
Object obj = null;
try {
clazz = Class.forName(unifiedClassName);
ctor = clazz.getConstructor();
obj = ctor.newInstance();
} catch (InstantiationException e) {
LOG.error("Error occurred: " + e);
}
}
public对象getInstance(字符串packageName,字符串className)
字符串unifiedClassName=packageName+“+”className;
LOG.info(“创建”+unifiedClassName+“实例…”);
类clazz=null;
构造函数=null;
objectobj=null;
试一试{
clazz=Class.forName(unifiedClassName);
ctor=clazz.getConstructor();
obj=ctor.newInstance();
}捕获(实例化异常e){
日志错误(“发生错误:+e”);
}
}
有趣的问题。。。我认为,如果采用这种方法,主要的挑战实际上是获取类路径中所有可用的类(我认为这仍然比尝试所有2^N个名称组合更有效)
也许您已经熟悉类路径扫描,所以您省略了它,因为它很明显?我在考虑类似的事情,或者寻找其他进行扫描的第三方(例如spring或JUnit)
无论如何,这将是一条有趣的线索:)我认为你从错误的角度看待问题。有那么多的课程你不能手工改变它们的案例吗?如果是这样,请编写一个简单的程序,遍历源文件夹,并使用正确大小写的文件名为您生成一个新文件。您可以使用所有可能的选项执行
Class.forName
调用。或者循环浏览该包中的文件,找到一个同名的文件。不确定您想做什么,但听起来不是一个很好的概念。@NeoMime相应的类在一个包中,有1000到5个类thousands@Bubletan是的,这就是我想做的。为什么这不是一个好概念?@IsuruGunawardana好吧,我的意思是这样做的原因。我不知道这背后的整个系统,但如果可能的话,其他一些方法可能会更好。相应的类在一个包中,有1000到5000个类