2011-10-31 33 views
5

Tôi đang cố tải một lớp thông qua một URLClassLoader (tốt, nó không hoạt động với trình nạp lớp bình thường) và muốn chúng không có bất kỳ sự cho phép nào.Lỗi quyền đối với Java Reflection

Vì vậy, tôi đã tạo trình quản lý bảo mật của riêng mình, tạo ra chìa khóa khi khởi động, chỉ có thể được yêu cầu một lần (trong chuỗi chính). Trình quản lý bảo mật có 2 danh sách, applicationThread, sẽ được cấp bất kỳ quyền nào và danh sách tạm thời, sẽ được cấp một quyền ngay lập tức (đó là về sự phản chiếu).

Vì nó là rất khó để descripe, tôi quyết định để tải lên toàn bộ điều: nhìn vào liên kết dưới đây

Ok, quay trở lại: Tôi tạo ra một sợi WatchDog, mà kiểm tra nếu thread không mất quá nhiều thời gian.

Khi tôi bắt đầu thể hiện hai lớp từ một URLClassLoader, tôi gọi chính xác 30 phương pháp mà không nhận được bất kỳ lỗi nào, nhưng vào cuộc gọi thứ 31, nó sẽ cố gắng kiểm tra Quyền sau đây nhưng điều này chỉ thực hiện sau cuộc gọi thứ 30.

 
java.lang.RuntimePermission accessClassInPackage.sun.reflect), 

Có ai biết điều gì đang xảy ra ở đó không?

chỉnh sửa: Tôi đã có thời gian để xóa ví dụ. http://myxcode.at/securitymanager.zip Tôi phát hiện ra rằng SecurityManager không được yêu cầu đồng bộ. Chỉ cần chạy đoạn mã nhỏ này và nhìn vào các đường màu đỏ.

Nếu các đường màu đỏ nằm trong hàng đầu tiên, chỉ cần chạy lại chương trình, bạn sẽ thấy rằng có vẻ như không kiểm soát được một chút.

Vấn đề nhiều hơn hoặc ít hơn là tôi cần trình quản lý bảo mật được đồng bộ hóa. Đây là đầu ra của tôi cho những người không thể đối mặt với lỗi (lỗi?) http://pastebin.com/E9yLRLif

edit2: có lẽ là về bàn điều khiển? có lẽ giao diện điều khiển quá chậm?

+2

Đun sôi vấn đề của bạn xuống đến một nhỏ, ngắn gọn, ví dụ hoàn chỉnh và gửi nó ở đây. –

+1

ok, đây là;) –

Trả lời

4

Đối với tôi việc kiểm tra xảy ra khi i=15:

checkPermission ((java.lang.RuntimePermission accessClassInPackage.sun.reflect)) cho chủ đề [chính, 5, chính]

Lý do để kiểm tra giấy phép bị trì hoãn là số inflationThreshold của lớp ReflectionFactory được sử dụng theo phương pháp invoke của NativeMethodAccessorImpl.java:

public Object invoke(Object obj, Object[] args) 
     throws IllegalArgumentException, InvocationTargetException { 
    if (++numInvocations > ReflectionFactory.inflationThreshold()) { 
     MethodAccessorImpl acc = (MethodAccessorImpl) new MethodAccessorGenerator() 
       .generateMethod(method.getDeclaringClass(), method 
         .getName(), method.getParameterTypes(), 
         method.getReturnType(), method 
           .getExceptionTypes(), method 
           .getModifiers()); 
     parent.setDelegate(acc); 
    } 

    return invoke0(method, obj, args); 
} 

Để vô hiệu hóa sự chậm trễ bạn có thể sử dụng Reflection API :)

Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold"); 
hack.setAccessible(true); 
hack.set(null, 0); 
+1

Phiên bản JDK của tôi là 1.6.0_23 btw – jeha

+0

Đã hoạt động, cảm ơn! –

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