我正在尝试使用 Clojure(bean obj)
检索与对象相关的不可变映射。
在 Clojure 1.4.0 标准库中,这大致是这样实现的(翻译成不熟悉 Clojure 的人可以访问的伪代码):
import java.beans.PropertyDescriptor;
import java.beans.Introspector;
function introspect(Object obj) {
Class clazz = obj.getClass();
PropertyDescriptor descriptors[] =
Introspector
.getBeanInfo(clazz)
.getPropertyDescriptors();
Map retval = new HashMap();
for(pd in descriptors) {
name = pd.getName();
method = pd.getReadMethod();
if(method.getParameterTypes().length != 0)
continue;
retval.set(name, method.invoke(obj, nil));
}
/* the real implementation does more magic below here,
but the above is sufficient for this question */
return retval;
}
在大多数情况下,这很好用—— java.bean.Introspector在其默认的BeanInfo实现中不返回非公共方法。但是,当被检查的对象是非公共类的实例时,它会返回该类的公共方法——即使这些方法实际上不能在不引发IllegalArgumentException
("Can't call public method of non-public班级”)。
如何解决这个问题?我正在查看java.lang.Class的文档,但我没有看到一种明显的方法来确定不涉及java.lang.SecurityException的 try/catch 块的类的权限......我认为这可能是最佳实践。此外,在非公共类上的方法实现公共接口的情况下,应该有某种机制来确定可以安全地调用该方法。