Trước hết, trọng Object.metaClass.invokeMethod
không hoạt động vì khi Groovy cố gắng giải quyết một lời gọi phương thức cho một kiểu X, nó sẽ kiểm tra metaClass của X, chứ không phải là metaClass của lớp cha của nó. Ví dụ, đoạn mã sau sẽ in "phương pháp intValue chặn"
Integer.metaClass.invokeMethod = {def name, def args ->
System.out.println("method $name intercepted")
}
6.intValue()
// Reset the metaClass
Integer.metaClass = null
Nhưng mã này sẽ không:
Object.metaClass.invokeMethod = {def name, def args ->
System.out.println("method $name intercepted")
}
6.intValue()
// Reset the metaClass
Object.metaClass = null
Câu hỏi của bạn là "Có thể ngăn chặn tất cả các phương pháp gọi trong một ứng dụng? ", nhưng bạn có thể được chính xác hơn một chút về việc liệu bạn muốn:
- Intercept cuộc gọi đến Groovy phương pháp, phương pháp Java, hoặc cả hai
- Intercept cuộc gọi đến chỉ phương pháp Groovy/Java của bạn hoặc cũng đánh chặn các cuộc gọi đến các lớp học thư viện Groovy/Java
Ví dụ, nếu bạn chỉ muốn chặn cuộc gọi đến các lớp học Groovy của bạn, bạn có thể thay đổi lớp học của bạn để thực hiện GroovyInterceptable. Điều này đảm bảo rằng invokeMethod() được gọi cho mọi phương thức được gọi trên các lớp đó. Nếu bản chất của việc đánh chặn (tức là những gì bạn muốn làm trước/sau khi gọi phương thức được gọi) là giống nhau cho tất cả các lớp, bạn có thể xác định invokeMethod()
trong một lớp riêng biệt và sử dụng @Mixin
để áp dụng nó cho tất cả các lớp của bạn.
Hoặc, nếu bạn cũng muốn chặn các cuộc gọi đến các lớp Java, bạn nên kiểm tra số DelegatingMetaClass.
Nguồn
2009-08-11 16:42:50
Đây có lẽ không phải là một ý tưởng hay. Bạn đang cố gắng để thực hiện? – noah