2014-04-14 4 views
6

싱글 톤 패턴을 사용하는 클래스에서 값을 할당받는 정적 변수가있는 경우로드 할 정적 변수에 값을 할당 할 수있는 모든 클래스를 필요로합니까?정확하게 클래스가로드되는 시점은 언제입니까?

내가 (기업 데이터를 보호하기 위해 단순화 된)이 같이 보입니다 코드를 함께 일하고 :

private static DEVICE_FACTORY; 

String factoryType = propertyFile.getDeviceFactoryType(); 

if(factoryType.equals("REAL")) 
    DEVICE_FACTORY = RealDeviceFactory.getInstance(); 
else 
    DEVICE_FACTORY = SimulatedDeviceFactory.getInstance(); 

코드를 공장의 각 유형에 대해 완전히 다른 프로젝트입니다. 프로덕션 jar의 프로덕션 버전에는 시뮬레이트 된 클래스가 포함되어 있지 않습니다. 내 문제는 생산 코드를 테스트하려고 할 때 "NoClassDefFoundError"이 "ClassNotFoundException"으로 인해 발생한다는 것입니다. 나는 JVM이 시뮬레이트 된 클래스를 생성 /로드하려고 시도하는 이유가 무엇인지 모르기 때문에 그 속성이 "REAL"로 올바르게 설정되어 있음을 확인했다.

EDIT 다음을 보여주는 간단한 버전을 만들려고 노력한다. 내일의 문제.

java.lang.NoClassDefFoundError: my/package/SimulatedDeviceFactory 
       at java.lang.Class.getDeclaredMethods0(Native Method) 
       at java.lang.Class.privateGetDeclaredMethods(Unknown Source) 
       at java.lang.Class.getMethod0(Unknown Source) 
       at java.lang.Class.getMethod(Unknown Source) 
       at sun.launcher.LauncherHelper.getMainMethod(Unknown Source) 
       at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: my.package.SimulatedDeviceFactory 
       at java.net.URLClassLoader$1.run(Unknown Source) 
       at java.net.URLClassLoader$1.run(Unknown Source) 
       at java.security.AccessController.doPrivileged(Native Method) 
       at java.net.URLClassLoader.findClass(Unknown Source) 
       at java.lang.ClassLoader.loadClass(Unknown Source) 
       at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
       at java.lang.ClassLoader.loadClass(Unknown Source) 

그것이 내가이 SimulatedDeviceFactory를 사용하지 않을거야 비록 따라서 장치 공장의 각 유형에 싱글 톤 패턴을 사용하고 있음을 수 있을까, 다음과 같이 (보호 기업 데이터 편집) 스택 추적입니다 그 클래스에서 정적 메서드 호출을 사용하고 있기 때문에 JVM은 어쨌든이 클래스를로드해야한다고 생각합니까?

그게 내가 그 신속하게 해결하기 위해 반사와 FQCN를 사용할 수있는 경우 ... 경우

+3

문제를 재현하는 예제로 줄일 수 있습니까? 이런 경우에는 세부 사항이 중요하며 코드가 유효하지 않습니다 (클래스 정의에서 if 문을 부동시킬 수 없음) –

+1

예외가 해당 'else'분기에서 처리 되나요? – MxyL

+0

다른 프로젝트의 jar 파일을 classpath에 두는 것을 잊지 않으셨습니까 ** ** **? – Powerlord

답변

0

이것은 Java의 작동 방식입니다. 메인 클래스를로드하는 동안 SimulatedDeviceFactory가로드됩니다.

그런 상황에서 리플렉션을 사용해야합니다. 그것은 좋은 것이고 아주 흔한 것입니다. 구성이 쉽고 디버그하기 쉽습니다.

다른 해결 방법을 사용하지 마십시오. JEE 애플리케이션 서버의 클래스 로더 관련 문제를 디버깅하는 것은 정말 어렵습니다.

관련 문제