使用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);
}
然后创建新的MyClass
实例,如
myClass.newInstance(new Object(), "Test");
是上述调用newInstance()
线程安全,myClass
是静态的吗?
调用Constructor.newInstance()
似乎不是严格的线程安全;至少在我的openjdk-6实现中,我发现一个类sun.reflect.NativeConstructorAccessorImpl
有一个字段定义为private int numInvocations;
,然后在这行代码中:if (++numInvocations > ReflectionFactory.inflationThreshold()) {
-这当然可能与预期的行为不同。同样,在Constructor
类本身中,方法acquireConstructorAccessor()
被记录为"注意这里没有使用同步"。
但是狡猾的行为似乎不会导致整体的意外行为,只是重复/不必要地做事情,因此并行调用newInstance()
不会导致一些事情被搞砸。
显然,在实例构造函数中所做的事情仍然会把事情搞砸。
是的,类实例是静态的,构造函数是线程安全的,只要它不对对象的静态上下文做任何非线程安全的事情。