Java 仅通过简单名称反射查找类
我想知道是否有任何给定的函数允许我内省一个类,而不必编写包含该类的包 例如,我想看看Integer类的方法和超类,为了做到这一点,我必须指定类所在的包。这将是“java.lang.Integer” 与其这样做,我只想键入类名,以便显示类的信息。就像这个“整数”Java 仅通过简单名称反射查找类,java,class,reflection,Java,Class,Reflection,我想知道是否有任何给定的函数允许我内省一个类,而不必编写包含该类的包 例如,我想看看Integer类的方法和超类,为了做到这一点,我必须指定类所在的包。这将是“java.lang.Integer” 与其这样做,我只想键入类名,以便显示类的信息。就像这个“整数” 我怎样才能让我的程序只检查类名,不管它位于哪里?这是不可能的,类一旦被引用就会动态加载。因此,没有办法深入查看可用包的列表,因为没有这样的东西 但是,有一些方法可以检查JAR,因为它们是zip文件(包括标准的JVM JAR)。Java不会
我怎样才能让我的程序只检查类名,不管它位于哪里?这是不可能的,类一旦被引用就会动态加载。因此,没有办法深入查看可用包的列表,因为没有这样的东西
但是,有一些方法可以检查JAR,因为它们是zip文件(包括标准的JVM JAR)。Java不会阻止您创建自己的
my.company.Integer
类和my.other.company.Integer
类,因此它无法知道哪个Integer
类是正确的
我建议的一个答案是,创建一个预定义的包列表,在其中搜索类,并继续尝试每个包,直到找到您的类
比如:
class ClassFinder{
public static final String[] searchPackages = {
"java.lang",
"java.util",
"my.company",
"my.company.other" };
public Class<?> findClassByName(String name) {
for(int i=0; i<searchPackages.length; i++){
try{
return Class.forName(searchPackages[i] + "." + name);
} catch (ClassNotFoundException e){
//not in this package, try another
} catch (...){
//deal with other problems...
}
}
//nothing found: return null or throw ClassNotFoundException
return null;
}
}
类查找器{
公共静态最终字符串[]searchPackages={
“java.lang”,
“java.util”,
“我的公司”,
“我的公司其他”};
公共类findClassByName(字符串名称){
for(int i=0;我引用的代码,稍加修改(…来自@rodion的答案)
如果发现重复的类名,修改相同的代码以引发异常
另外,请参见“与其这样做,我只想键入类名,以便显示类的信息。就像这个“整数”嗯……如果您键入Timer
,会发生什么?很酷,谢谢您的想法,这将非常有用,谢谢您的帮助。如果您实际上不想加载该类,您可以将forName()的initialize参数设置为false-我想-我自己还没有尝试过
/**
* Returns first loaded Class found in the searchPackages
* @param classname the simple class name (e.g. "String")
* @param searchPackages String[] of packages to search.
* <li>Place the more important packages at the top since the first Class
* found is returned</li>
* <code>//Example
* public static final String[] searchPackages = {
* "java.lang",
* "java.util",
* "my.company",
* "my.company.other" };
* </code>
* @return the loaded Class or null if not found
*/
public static final Class<?> findClassByName(String classname, String[] searchPackages) {
for(int i=0; i<searchPackages.length; i++){
try{
return Class.forName(searchPackages[i] + "." + classname);
} catch (ClassNotFoundException e){
//not in this package, try another
}
}
//nothing found: return null or throw ClassNotFoundException
return null;
}
/**
* Returns the loaded Class found in the searchPackages
* @param classname the simple class name (e.g. "String")
* @param searchPackages String[] of packages to search.
* <li>Place the more important packages at the top since the first Class
* found is returned</li>
* <code>//Example
* public static final String[] searchPackages = {
* "java.lang",
* "java.util",
* "my.company",
* "my.company.other" };
* </code>
* @throws RuntimeException if more than one class of the same classname found in multiple packages
* @return the loaded Class (guaranteed to be unique among the searchPackages) or null if not found
*/
public static final Class<?> findClassByNameNoDupes(String classname, String[] searchPackages) {
Class<?> foundClass = null;
for(int i=0; i<searchPackages.length; i++){
try{
boolean wasNull = foundClass == null;
foundClass = Class.forName(searchPackages[i] + "." + classname);
if (!wasNull) throw new RuntimeException(classname + " exists in multiple packages!");
} catch (ClassNotFoundException e){
//not in this package, try another
}
}
return foundClass;
}