我正在尝试使用反射来查看是否可以输入类名,并且我的应用程序将加载该类并创建它的实例。经过几次尝试后,我发现我不能只在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);
它以一种非常奇怪的方式工作。例如,当我在提示符处输入“对象”时,它以某种方式设法加载sun.net.util.Object
,但是当我打印出它打印的实际对象时class java.lang.Object
。String
我输入的 a以及其他几件事也得到了同样的结果。我尝试过的一个有趣的方法是int
- 它已加载sun.net.util.int
,当我打印对象时它只返回 null。当我尝试时发生了另一个Java
:
Java
LOADED A CLASS!!!!
sun.net.util.Java
null
有谁知道这里发生了什么?sun.net.util
造成这种情况的包裹有什么特别之处吗?我真的不在乎我的代码不能完全按照我的意愿工作,我只是想知道是什么导致了这种奇怪的行为。
爪哇版:
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)
如果这有什么不同,我使用的是 Windows 8 64 位。