아래 코드와 같이 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()
에 유효한 입력이 될 수 있습니다.
...하지만 어떻게 구현해야할지 모르겠다. 어떤 아이디어?
불량. 그래서 언어의 이름! = VM의 이름. :-(점으로 구분 된 표기법을 적절한 $로 변환하는 쉬운 방법이 있습니까? 예를 들어, com.example.test.Enum2.Test, com.example.test.Enum2 $ Test, com .example.test $ Enum2 $ Test, etc.) –
@Jason S : 아쉽게도 모호합니다 .xyz.ABC는'xyz.ABC' 또는'xyz.AB $ C' 또는'xyz.A $ B $ C' 또는'xyz $ A $ B $ C'입니다. "달러 버전"은 분명합니다. –
그래, 고마워, 그게 내가 생각했던거야. (설명에 +1) –