我正在尝试使用反射来查看是否可以达到我能够输入类名的位置,我的应用程序将加载该类并创建它的实例.经过几次尝试后,我发现我不能仅仅在Class.forName()没有包名的情况下粘贴一个类名,所以我最终尝试获取已加载的所有可用包的列表并尝试加载我输入的每个包的类直到它被击中为止.
这是我到目前为止所得到的:
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String s = "";
do
{
ClassLoader clsldr = ClassLoader.getSystemClassLoader();
Package[] pkgs = Package.getPackages();
s = console.readLine();
if(s.equals(":exit"))
{
System.exit(0);
}
boolean classFound = false;
Object loadedClass = null;
String classname = "";
for (int i = 0; i < pkgs.length; i++) {
Package package1 = pkgs[i];
try
{
classname = package1.getName().replace('/', '.') + "." + s;
clsldr.loadClass(classname);
loadedClass = Class.forName(classname);
classFound = true;
}
catch(Exception e)
{
}
}
System.out.println("LOADED A CLASS!!!!");
System.out.println(classname);
System.out.println(loadedClass);
}
while(s.length() == 0);
Run Code Online (Sandbox Code Playgroud)
它半工作非常奇怪.例如,当我在提示符下键入"对象"时,它以某种方式设法加载sun.net.util.Object,但是当我打印出它打印的实际对象时class java.lang.Object.我输入的东西和String其他几种东西一样.我试过的一个有趣的是int- 它加载了sun.net.util.int,当我打印对象时它只返回null.我尝试时发生了另一件事Java:
Java
LOADED A CLASS!!!!
sun.net.util.Java
null
Run Code Online (Sandbox Code Playgroud)
有没有人知道这里发生了什么?这个sun.net.util包有什么特别之处吗?我真的不在乎我的代码不能完全像我想要的那样工作,我只想知道是什么导致了这种奇怪的行为.
Java版本:
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)
如果这有任何区别,我在Windows 8 64位上.
我只是想到一件事:当我找到课程时,我从来没有打破我的循环。所以这件事实际上可能设法达到将java.lang.Object加载的类设置为 true,但它继续在循环中覆盖加载的实际类,并且sun.net.util可能是我的系统上加载的最后一个包。我所需要的只是一个break语句,它应该停止这种行为。