Tôi đang cố gắng để chơi với sự phản ánh để xem liệu tôi có thể đến một điểm mà tôi có thể gõ vào một tên lớp và ứng dụng của tôi sẽ tải lớp đó và tạo một thể hiện của nó. Sau một vài lần, tôi thấy mình không thể chỉ gắn tên lớp trong Class.forName()
mà không có tên gói của nó, vì vậy tôi cố gắng lấy danh sách tất cả các gói sẵn có đã được tải và cố gắng tải lớp tôi nhập vào với mỗi tên gói cho đến khi nó bị trúng.Tại sao sự phản chiếu của tôi tải các lớp kỳ lạ?
Đây là những gì tôi đã có cho đến nay:
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);
Nó bán làm việc theo một cách rất lạ. Ví dụ khi tôi gõ vào "Object" tại dấu nhắc nó bằng cách nào đó quản lý để tải sun.net.util.Object
, nhưng khi tôi in ra các đối tượng thực tế nó in class java.lang.Object
. Tôi nhận được điều tương tự với một số String
cũng như một số thứ khác mà tôi đã nhập. Một trong những thú vị tôi đã cố gắng là int
- nó nạp sun.net.util.int
và khi tôi in đối tượng nó chỉ trả về null. Một điều khác đã xảy ra khi tôi thử Java
:
Java
LOADED A CLASS!!!!
sun.net.util.Java
null
Có ai có bất kỳ đầu mối nào đang xảy ra ở đây không? Có điều gì đặc biệt về gói sun.net.util
gây ra điều này không? Tôi không thực sự quan tâm rằng mã của tôi không hoạt động chính xác như tôi muốn, tôi chỉ muốn biết điều gì gây ra hành vi kỳ lạ này.
phiên bản 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)
Tôi đang trên Windows 8 64 bit nếu mà làm cho bất kỳ sự khác biệt.
Ngoại trừ rằng sơ đồ đó sẽ thất bại nếu lớp "lạ" là lớp xuất hiện đầu tiên. Hoặc nếu cả hai lớp là "lạ"; ví dụ. 'java.util.Date' so với' java.sql.Date'. –