(bean obj)
Clojure を使用して、オブジェクトに関連する不変のマップを取得しようとしています。
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
。クラス")。
これはどのように修正できますか?java.lang.Classのドキュメントを調べていますが、java.lang.SecurityExceptionの try/catch ブロックを含まないクラスのアクセス許可を決定する明白な方法がわかりません ... これはありません」ベストプラクティスである可能性が高いと私は正確に思います。さらに、非パブリック クラスのメソッドがパブリック インターフェイスを実装する場合、このメソッドを安全に呼び出すことができるかどうかを判断するための何らかのメカニズムを使用できる必要があります。