如何将值设置为 class 中的私有变量,其中 class 构造函数本身启动线程?
How to set values to private variable in class where class constructor itself starting the thread?
下面是我的源代码 class 其中 class 构造函数在 运行() 中启动 thread.But 它正在检查 [=21= 的非空值] 为了测试使用 junit 变量不应该为空。
public class MainClass extends Thread {
private SomeQue que;
private static final String THREAD_NAME = "s_thread";
private boolean isRunning = false;
public MainClass () {
setName(THREAD_NAME);
setIsRunning(true);
start();
}
public void run() {
while (isRunning()) {
if (que!= null) {
obj = que.pop();
if (obj != null) {
//....
}
}
}
}
}
如果使用
ReflectioinTerstUtils.setField(new MainClass(),"que",que);
我们必须创建对象以将数据设置为变量,同时创建对象本身线程正在获得 started.So 任何想法..
我看到的解决这个问题的唯一方法(除了重构)是在不调用构造函数的情况下创建对象的实例。这可以使用内部 class sun.misc.Unsafe 来完成:
注意:这个 class 的名字告诉你它有多么强大(和致命)。拥有权利的同时也被赋予了重大的责任。明智地使用。
// Obtain the unsafe object without throwing a SecurityException (assuming no security manager)
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
// Create the instance
MainClass instance = (MainClass) unsafe.allocateInstance(MainClass.class); // Constructor is not called
// set isRunning if needed
// do junit stuff
下面是我的源代码 class 其中 class 构造函数在 运行() 中启动 thread.But 它正在检查 [=21= 的非空值] 为了测试使用 junit 变量不应该为空。
public class MainClass extends Thread {
private SomeQue que;
private static final String THREAD_NAME = "s_thread";
private boolean isRunning = false;
public MainClass () {
setName(THREAD_NAME);
setIsRunning(true);
start();
}
public void run() {
while (isRunning()) {
if (que!= null) {
obj = que.pop();
if (obj != null) {
//....
}
}
}
}
}
如果使用
ReflectioinTerstUtils.setField(new MainClass(),"que",que);
我们必须创建对象以将数据设置为变量,同时创建对象本身线程正在获得 started.So 任何想法..
我看到的解决这个问题的唯一方法(除了重构)是在不调用构造函数的情况下创建对象的实例。这可以使用内部 class sun.misc.Unsafe 来完成:
注意:这个 class 的名字告诉你它有多么强大(和致命)。拥有权利的同时也被赋予了重大的责任。明智地使用。
// Obtain the unsafe object without throwing a SecurityException (assuming no security manager)
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
// Create the instance
MainClass instance = (MainClass) unsafe.allocateInstance(MainClass.class); // Constructor is not called
// set isRunning if needed
// do junit stuff