Proxy オブジェクト ( を実装するオブジェクトjava.lang.reflect.InvocationHandler
) で、プロキシされたオブジェクトにインスタンス変数を設定しようとしています。
次のように:
public class ServiceProxy implements InvocationHandler {
private final Object proxiedObject;
private ServiceProxy(final Object object) {
this.proxiedObject = object;
}
public static Object newInstance(final Object object) {
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new ServiceProxy(object));
}
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
Object result = null;
MyObject mo = new MyObject();
// Is the following safe when the proxiedObject is being acceessed by multiple threads?
final Field sessionField = this.proxiedObject.getClass().getSuperclass().getDeclaredField("mo");
sessionField.setAccessible(true);
sessionField.set(this.object, mo);
result = method.invoke(this.proxiedObject, args);
return result;
}
}
これは安全ですか?
編集:
実際のコード:
Object result = null;
Session session = HibernateUtil.getSessionFactory().getCurrentSession()
// Is the following save when the proxiedObject is being acceessed by multiple threads?
final Field sessionField = this.proxiedObject.getClass().getSuperclass().getDeclaredField("session");
sessionField.setAccessible(true);
sessionField.set(this.object, session);
result = method.invoke(this.proxiedObject, args);
return result;
Edit2 : プロキシされたオブジェクトは、同じプロキシされたオブジェクトの複数のメソッドを同時に呼び出す GWT クライアントから呼び出されています。これが発生すると、(プロキシされたクラスの) セッション インスタンス フィールドが閉じられ、予期しない方法で開かれます。