2012-05-22 37 views
6

Tôi muốn biết khi nào thuộc tính Hệ thống bị thay đổi. Tôi có một ứng dụng, trong một máy chủ ứng dụng, bằng cách nào đó đang thay đổi một thuộc tính hệ thống (System.setProperty() Tôi nghĩ). Tôi đã tham gia một cái nhìn và tôi đã tìm thấy cách tiếp cận khác nhau:Cách phát hiện xem thuộc tính Hệ thống Java có thay đổi không?

  1. JPDA?
  2. Observer & Observable?
  3. Property change listener?
  4. JMX?

Bất kỳ lời đề nghị? Cảm ơn trước.

+0

Bạn đã đề cập đến JMX. Bạn đang cố gắng phát hiện thuộc tính từ bên ngoài ứng dụng của mình? – Gray

+1

Bạn có thể thử chạy với trình quản lý/chính sách bảo mật nghiêm cấm thay đổi và xem nơi xảy ra hiện tượng xói mòn. – bmargulies

+1

Tại sao bạn cần biết liệu thuộc tính Hệ thống có bị thay đổi không? Nếu bạn không cần một thông báo đồng bộ, tại sao không chỉ sinh ra một chuỗi được lên lịch để kiểm tra định kỳ? (Điều đơn giản nhất có thể hoạt động?) –

Trả lời

5

Bạn có thể thay thế Thuộc tính hệ thống bằng lớp con tùy chỉnh của riêng bạn.

MyProperties newProps = new MyProperties(System.getProperties()); 
System.setProperties(newProps); 

Sau đó, chỉ cần viết phân lớp của Thuộc tính móc các phương pháp có liên quan.

+0

Cảm ơn bạn jtahlborn! Có, tôi có thể, bạn đang suy nghĩ trong một số loại trang trí (như HttpServletRequestWrapper cho HttpServletRequest)? Vấn đề là ứng dụng nên gọi thực hiện của tôi ... – Gaucho

+1

@Gaucho - nó không thực sự cần phải được trang trí. một lớp con đơn giản ghi đè các phương thức mà bạn quan tâm là tất cả những gì bạn cần. bạn chỉ cần sao chép các thuộc tính hệ thống hiện có vào impl của bạn. – jtahlborn

+0

mmm, thú vị và cách tôi có thể làm cho ứng dụng gọi cài đặt của tôi thay vì cài đặt mặc định? Cảm ơn! – Gaucho

1

Nếu bạn chủ yếu muốn tìm sự cố, tôi sẽ xem xét sử dụng số SecurityManager cho việc này. Nó có một vài phương pháp có sẵn checkPropertiesAccess()checkPropertyAccess() trông giống như chúng sẽ giúp bạn tìm thấy vấn đề, nhưng không nhất thiết phải 'thông báo cho bạn khi thuộc tính hệ thống đã thay đổi'.

+0

Cảm ơn bạn Nicholas! Vâng, đó là nỗ lực đầu tiên của tôi: thử {securityManager.checkPermission (new PropertyPermission ("javax.xml.parsers.DocumentBuilderFactory", "write"));} catch (SecurityException securityException) {.../... Nhưng bạn cần để tạo trình quản lý bảo mật trước. Xem http://stackoverflow.com/questions/10624468/deny-jvm-system-property-write – Gaucho

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