2014-04-14 17 views
6

Nếu tôi có một biến tĩnh được gán giá trị từ một lớp sử dụng mẫu đơn, thì bằng cách nào đó yêu cầu tất cả các lớp có khả năng gán giá trị cho biến tĩnh đó sẽ được nạp?Khi nào chính xác là một lớp được tải?

tôi đang làm việc với mã mà trông giống như sau (đơn giản hóa để bảo vệ dữ liệu của công ty):

private static DEVICE_FACTORY; 

String factoryType = propertyFile.getDeviceFactoryType(); 

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

Mã này đối với từng loại nhà máy là trong các dự án hoàn toàn khác nhau. Phiên bản sản xuất của lọ ứng dụng không chứa bất kỳ lớp mô phỏng nào. Vấn đề của tôi là khi tôi thử kiểm tra mã sản xuất của mình, tôi đang gettting "NoClassDefFoundError" do "ClassNotFoundException" gây ra. Tôi đã xác nhận rằng tài sản được thiết lập một cách chính xác để "REAL" vì vậy tôi không có ý tưởng tại sao JVM thậm chí còn cố gắng tạo/tải các lớp mô phỏng ...

EDIT Tôi sẽ cố gắng để tạo ra một phiên bản đơn giản thể hiện sự vấn đề ngày mai. Stack trace (chỉnh sửa để dữ liệu doanh nghiệp được bảo vệ) như sau:

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) 

Nó có thể được rằng tôi đang sử dụng mô hình singleton trên từng loại nhà máy thiết bị do đó, mặc dù tôi sẽ không sử dụng SimulatedDeviceFactory, bởi vì tôi đang sử dụng một cuộc gọi phương thức tĩnh từ lớp đó, JVM nghĩ rằng nó cần phải tải nó?

Nếu đó là trường hợp tôi có thể sử dụng phản xạ và một FQCN để giải quyết một cách nhanh chóng đủ ...

+3

Bạn có thể giảm điều này xuống ví dụ để tái tạo sự cố không? Các chi tiết thực sự quan trọng trong trường hợp như thế này, và mã của bạn không hợp lệ (bạn không thể có nổi nếu các câu lệnh trong định nghĩa lớp) –

+1

Ngoại lệ có được ném vào nhánh 'else' khác không? – MxyL

+0

Bạn đã nhớ đặt các tệp jar cho các dự án khác trong classpath của bạn, ** right **? – Powerlord

Trả lời

0

Đây là cách Java hoạt động. SimulatedDeviceFactory được nạp trong khi tải lớp chính.

Bạn nên sử dụng sự phản chiếu trong tình huống đó. Nó là tốt và khá phổ biến patter. Dễ cấu hình và dễ gỡ lỗi.

Tránh sử dụng bất kỳ giải pháp thay thế nào khác. Gỡ rối các vấn đề liên quan đến trình nạp lớp trong các máy chủ ứng dụng JEE thực sự là đau trong một **.

Các vấn đề liên quan