2011-02-09 4 views
11

아래 코드와 같이 com.example.test.Enum2.Test 클래스가있는 경우 getCanonicalName()com.example.test.Enum2.Test을 반환하지만 Class.forName()"com.example.test.Enum2$Test"을 인수로 필요합니까?

enum이 중첩 클래스 일 때 각 $. 가능성을 확인하지 않고 이름으로 열거 형 값을 serialize/deserialize 할 수 있도록 일관성있는 방법이 있습니까?

package com.example.test; 

import java.util.Arrays; 

public class Enum2 { 

    enum Test { 
     FOO, BAR, BAZ; 
    } 

    public static void main(String[] args) { 
     for (String className : Arrays.asList(
       "com.example.test.Enum2.Test", 
       "com.example.test.Enum2$Test")) 
     { 
      try { 
       Class<?> cl = Class.forName(className); 
       System.out.println(className+" found: "+cl.getCanonicalName()); 
      } 
      catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
      } 
     } 

     System.out.println(Test.FOO.getDeclaringClass().getCanonicalName()); 
    } 
} 

설명

:는 나도 실제 응용 프로그램 (위의 인위적인 테스트 케이스가 아닌)에서이 문제를 해결하는 좋은 방법을 찾고 있어요 :

을 수행합니다. getCanonicalName()의 출력 (점으로 구분 된 이름 만)을 사용하여 직렬화/비 직렬화를 수행하고 Class.forName()은 차례대로 각 가능성을 시도하십시오. 먼저 "com.example.test.Enum2.Test",이어서 "com.example.test.Enum2$Test",이어서 "com.example.test$Enum2$Test"

b. 적절한 $ 표기법을 사용하십시오. 따라서 Class.forName()이 처음 제대로 작동합니다. 그러나 이것은 Class.forName()과 일치하는 문자열을 생성하는 getCanonicalName()에 대한 대안을 구현해야합니다.

부분적으로 gut 느낌에서 부분적으로 접근하고 (부분적으로) 접근법 (a)에 대문자가있는 패키지 이름 인 com.example.Test.Enum2 및 com.example.Test $가있는 경우 모호성이 있기 때문에 부분적으로 접근하고 있습니다. Enum2는 com/example/Test/Enum2.java가 있고 com/example/Test.java가 Enum2 내부 클래스 인 경우 Class.forName()에 유효한 입력이 될 수 있습니다.

...하지만 어떻게 구현해야할지 모르겠다. 어떤 아이디어?

답변

9

ARGH : Class.getCanonicalName() 대신 단순히 Class.getName()을 사용해야합니다.

5

음, getCanonicalName 상태에 대한 문서 :

는 Java 언어 사양 정의에 따라, 기본이되는 클래스 의 표준 명을 돌려줍니다.

(강조 광산.) 자바

언어는 중첩은 점으로 표시된다. 라이브러리와 VM에 관한 한, 중첩 클래스는 이름에 $가있는 클래스 일뿐입니다.

당신이 말한 직렬화에 대해 언급하지 않았습니다. 양방향으로 일관성이 있다면 오히려 괜찮을 것입니다.

+0

불량. 그래서 언어의 이름! = VM의 이름. :-(점으로 구분 된 표기법을 적절한 $로 변환하는 쉬운 방법이 있습니까? 예를 들어, com.example.test.Enum2.Test, com.example.test.Enum2 $ Test, com .example.test $ Enum2 $ Test, etc.) –

+0

@Jason S : 아쉽게도 모호합니다 .xyz.ABC는'xyz.ABC' 또는'xyz.AB $ C' 또는'xyz.A $ B $ C' 또는'xyz $ A $ B $ C'입니다. "달러 버전"은 분명합니다. –

+0

그래, 고마워, 그게 내가 생각했던거야. (설명에 +1) –