programing

Class.forName을 사용하여 중첩 된 정적 클래스 인스턴스화

copyandpastes 2021. 1. 18. 22:15
반응형

Class.forName을 사용하여 중첩 된 정적 클래스 인스턴스화


나는 nested static class좋아한다 :

package a.b
public class TopClass {

    public static class InnerClass {
    }
}

인스턴스화하고 Class.forName()싶지만 ClassNotFoundException.

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

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

내 코드에 어떤 문제가 있습니까?

우도.


중첩 클래스는 "$"를 구분 기호로 사용합니다.

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

이러한 방식으로 JRE는 중첩 된 클래스에 대한 걱정없이 점을 사용하여 패키지를 결정할 수 있습니다. 생성 된 클래스 파일을 보면이 사실을 알 수 있습니다 TopClass$InnerClass.class.

(편집 : 원래의 부정확성에 대한 사과. 파일 이름에 대해 생각할 때까지 머리가 .NET 땅에 갇혀있었습니다 ...)


시험

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


내부 클래스는 달러 기호를 통해 액세스됩니다.

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

내부 클래스는 항상 달러 기호를 통해 액세스됩니다. Java 컴파일러가 Java 소스 코드 파일을 컴파일 할 때 .class 파일 (바이트 코드)을 생성하기 때문입니다.

예를 들어 Hello.java에 대한 클래스가 하나만 있고이 클래스가 외부 클래스 인 경우 컴파일시 Java 컴파일러가 Hello.class 파일을 생성하지만이 클래스에 내부 클래스 HelloInner가 있으면 Java 컴파일러가 d Hello $ HelloInner.class (바이트 코드를 생성합니다. ).

따라서 바이트 코드는 항상 Outer.java라는 이름의 다음 스 니펫과 같습니다.

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

따라서 바이트 코드는 다음과 같습니다 .Outer $ Inner1 $ Inner2.class

이것이 우리가 $ 기호를 사용하여 내부 클래스에 액세스하는 이유입니다. :)

참조 URL : https://stackoverflow.com/questions/7007831/instantiate-nested-static-class-using-class-forname

반응형