使用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
是否是线程安全的?
答案 0 :(得分:4)
是的,类实例是静态的,构造函数是线程安全的,只要它没有对对象的静态上下文做任何非线程安全的事情。
答案 1 :(得分:3)
调用Constructor.newInstance()
似乎严格线程安全;至少在我的openjdk-6实现中,我找到了一个类sun.reflect.NativeConstructorAccessorImpl
,其字段定义为private int numInvocations;
,稍后在这行代码中if (++numInvocations > ReflectionFactory.inflationThreshold()) {
- 这可能会按预期运行。<登记/>
此外,在Constructor
类本身中,方法acquireConstructorAccessor()
记录为“请注意,此处未使用同步”。
但是这种狡猾的行为似乎并没有导致整体意外行为,只是重复/不必要地做事,因此并行调用newInstance()
不会导致某些事情被搞砸。
显然,你仍然可以搞清楚实例构造函数中的内容。