2011-08-10 25 views
41

Tôi có một như nested static class:nhanh chóng lồng lớp tĩnh nhờ sủ dụng Class.forName

package a.b 
public class TopClass { 

    public static class InnerClass { 
    } 
} 

Tôi muốn nhanh chóng với Class.forName() nhưng nó đặt ra một ClassNotFoundException.

Class.forName("a.b.TopClass"); // Works fine. 
Class.forName("a.b.TopClass.InnerClass"); // raises exception 

TopClass.InnerClass instance = new TopClass.InnerClass(); // works fine 

Điều gì sai trong mã của tôi?

Udo.

+3

'Class.forName (" abTopClass $ InnerClass ");' –

+1

... nhưng xin vui lòng không nếu bạn có thể tránh nó. –

Trả lời

67

lớp lồng nhau sử dụng "$" để tách:

Class.forName("a.b.TopClass$InnerClass"); 

Bằng cách đó JRE có thể sử dụng dấu chấm để xác định gói, mà không lo lắng về các lớp lồng nhau. Bạn sẽ phát hiện ra điều này nếu bạn nhìn vào tệp lớp được tạo, sẽ là TopClass$InnerClass.class.

(EDIT:. Xin lỗi cho sự thiếu chính xác ban đầu đã bị mắc kẹt trong đất NET cho đến khi tôi nghĩ về tên tập tin ...)

18

thử

Class.forName("a.b.TopClass$InnerClass");

+1

+1, bạn là người đầu tiên đưa ra câu trả lời đúng – Bozho

8

lớp Inner được truy cập thông qua đồng USD sign:

Class.forName("a.b.TopClass"); 
Class.forName("a.b.TopClass$InnerClass"); 
1

Lớp bên trong luôn được truy cập thông qua ký hiệu đô la vì khi trình biên dịch java biên dịch tệp mã nguồn java i t tạo tệp .class (mã byte).

nếu chỉ có một lớp, ví dụ Hello.java và lớp này là lớp ngoài thì trình biên dịch java trên trình biên dịch tạo tệp Hello.class nhưng nếu lớp này có lớp bên trong HelloInner thì trình biên dịch java tạo d Hello $ HelloInner. lớp (mã byte).

để bytecode luôn trông giống như cho sau đoạn với tên Outer.java:

public class Outer 
    { 
    public var;//member variable 
     Outer()//constructor 
     { 
     } 
     class Inner1 
     { 
      class Inner2 
      { 
       } 
     } 
     } 

mã để byte là: Outer $ Inner1 $ Inner2.class

đó là lý do tại sao chúng ta sử dụng $ dấu hiệu để truy cập vào lớp bên trong. :)

Các vấn đề liên quan