1

使用Java 反射,可以实例化一个类的对象,甚至通过私有构造函数,例如

public class MyClass
{
    private MyClass(Object p1, String p2)
    {
        // Constructor with no modifications to static code
    }
}

一个可以做(在同一类或任何其他类中,为简化而省略异常处理)

public static final Constructor myClass;

static
{
    myClass = MyClass.class.getConstructor(Object.class, String.class);
    myClass.setAccessible(true);
}

然后创建MyClasslike的新实例

    myClass.newInstance(new Object(), "Test");

newInstance()鉴于这myClass是静态的,上述对线程安全的调用是否是线程安全的?

4

2 回答 2

4

是的,类实例是静态的,并且构造函数是线程安全的,只要它没有对对象的静态上下文做任何非线程安全的事情。

于 2013-04-03T18:58:58.690 回答
4

调用Constructor.newInstance()似乎不是严格线程安全的;至少在我的 openjdk-6 实现中,我找到了一个类,该类sun.reflect.NativeConstructorAccessorImpl的字段定义为private int numInvocations;和后面的这行代码:if (++numInvocations > ReflectionFactory.inflationThreshold()) {- 它的行为肯定与预期的不同。
此外,在Constructor类本身中,该方法acquireConstructorAccessor()记录为“注意这里没有使用同步”。

但是狡猾的行为似乎不会导致整体意外行为,只会重复/不必要地做事情,因此newInstance()并行调用不会导致事情被搞砸。

显然,您仍然可以将实例构造函数中所做的事情搞砸。

于 2013-04-03T20:02:50.807 回答