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
'programing' 카테고리의 다른 글
솔루션 탐색기 VS2010에서 부분 클래스 파일을 그룹화하는 방법 (0) | 2021.01.18 |
---|---|
MOQ-인수 값 (다중 인수)을 기반으로 메서드 설정 (0) | 2021.01.18 |
일반적으로 .gitignore를 통해 제외되는 Node.JS 관련 파일 및 폴더는 무엇입니까? (0) | 2021.01.18 |
파이썬 소스 코드를 여러 파일로 분할 하시겠습니까? (0) | 2021.01.18 |
Screenshot UX Trial과 같이 루트 권한없이 프로그래밍 방식으로 다른 앱의 스크린 샷을 찍는 방법은 무엇입니까? (0) | 2021.01.18 |