我问这纯粹是为了确定在课程中实施课程的有价值的…
您是否知道Java实用程序类采用未同步的实例,使用反射来调查该实例,并在同步调用中返回“包装”的输入实例?
(即:为任何实例创建同步委托类的工厂)
解决方法:
我喜欢Jon Skeet的回答;它看到了森林而不是树木.但要回答这个问题:
假设实例属于某个接口,使用java.lang.reflect.Proxy很容易.
public final class SynchronizedFactory {
private SynchronizedFactory() {}
public static <T> T makeSynchronized(Class<T> ifCls, T object) {
return ifCls.cast(Proxy.newProxyInstance(
object.getClass().getClassLoader(),
new Class<?>[] {ifCls},
new Handler<T>(object)));
}
private static class Handler<T> implements InvocationHandler {
private final T object;
Handler(T object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
synchronized (object) {
return method.invoke(object, args);
}
}
}
}
顺便说一句,此代码未经过测试.使用风险由您自己承担.