2012-02-20 26 views
8

Tôi có một phương pháp hữu ích để tìm phương thức getter của một đối tượng cho một lĩnh vực cụ thể (sử dụng phản ánh):Làm thế nào để làm cho Class.getMethod() ném một SecurityException

public static Method findGetter(final Object object, final String fieldName) { 
    if(object == null) { 
     throw new NullPointerException("object should not be null"); 
    } else if(fieldName == null) { 
     throw new NullPointerException("fieldName should not be null"); 
    } 

    String getterName = getMethodNameForField(GET_PREFIX, fieldName); 

    Class<?> clazz = object.getClass(); 
    try { 
     return clazz.getMethod(getterName); 
    } catch(final NoSuchMethodException e) { 
     // exception handling omitted 
    } catch(final SecurityException e) { 
     // exception handling omitted 
    } 
} 

Tôi muốn viết một bài kiểm tra đơn vị đó bao gồm trường hợp SecurityException, nhưng làm cách nào để tôi có thể thực hiện getMethod ném một ngoại lệ bảo mật?

Các trạng thái javadoc rằng getMethod sẽ ném SecurityException

Nếu một người quản lý an ninh, s, là hiện tại và bất kỳ điều kiện sau đây được đáp ứng:

  • gọi của s.checkMemberAccess (điều này, Member.PUBLIC) từ chối truy cập vào phương thức

  • trình nạp lớp của người gọi không giống hoặc tổ tiên của lớp oader cho lớp hiện tại và gọi s.checkPackageAccess() từ chối truy cập vào các gói của lớp này

Tôi muốn kích hoạt các ngoại lệ bình thường, chứ không phải là phải dùng đến một khuôn khổ mocking.

Trả lời

11
System.setSecurityManager(new SecurityManager(){ 
    @Override 
    public void checkMemberAccess(Class<?> clazz, int which) { 
     throw new SecurityException("Not allowed") 
    } 
    @Override 
    public void checkPermission(Permission perm) { 
     // allow resetting the SM 
    } 
}); 
ClassTest.class.getMethod("foo"); 

Nhớ gọi số System.setSecurityManager(null) trong khối finally để khôi phục trạng thái ban đầu.

+0

Cảm ơn @Bozho! Đó là một kịch bản rất khó, nhưng thật tuyệt khi có thể kiểm tra dễ dàng. –

0

Theo như điều này gây ra trong một cài đặt bình thường, có rất ít trường hợp điều này có thể xảy ra.

Phương pháp phi công khai sẽ dẫn đến NoSuchMethodException, bởi vì getMethod chỉ dành riêng cho phương pháp công khai. getDeclaredMethod sẽ tìm phương thức, nhưng cho phép trả lại phương thức riêng tư/được bảo vệ.

Cách duy nhất để thực hiện điều này là, như javadocs nói, có một gói riêng được bảo vệ bởi trình quản lý bảo mật mà tôi đoán chỉ có thể thực hiện với các ứng dụng chưa được ký hoặc các quyền tương tự. (Tôi chưa bao giờ tự mình làm điều này, vì vậy tôi không hoàn toàn chắc chắn)

Đặt cược tốt nhất của bạn là buộc ngoại lệ phải được ném cho các phương thức cụ thể bằng cách ghi đè trình quản lý bảo mật.

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