싱글 톤 패턴을 사용하는 클래스에서 값을 할당받는 정적 변수가있는 경우로드 할 정적 변수에 값을 할당 할 수있는 모든 클래스를 필요로합니까?정확하게 클래스가로드되는 시점은 언제입니까?
내가 (기업 데이터를 보호하기 위해 단순화 된)이 같이 보입니다 코드를 함께 일하고 :
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를 사용할 수있는 경우 ... 경우
문제를 재현하는 예제로 줄일 수 있습니까? 이런 경우에는 세부 사항이 중요하며 코드가 유효하지 않습니다 (클래스 정의에서 if 문을 부동시킬 수 없음) –
예외가 해당 'else'분기에서 처리 되나요? – MxyL
다른 프로젝트의 jar 파일을 classpath에 두는 것을 잊지 않으셨습니까 ** ** **? – Powerlord