我试图在Eclipse调试器的Java程序中使用watchpoint跟踪值的更改.类层次结构非常复杂,我跟踪的值包含在容器中,容器在很多地方使用.
更具体地说,有一个容器SizeRequirement,它有一个属性minimum,我正在跟踪.许多组件的许多布局管理器都使用此类来定义组件大小的要求.我需要捕获完全调用,其中值更改/设置为一个特定的布局管理器和其中的一个特定组件.是否可以通过调用者过滤断点?我将尝试使用一些抽象代码来解释问题:
class ValueContainer {
public String value;
}
class A {
private ValueContainer valueContainer;
public A () {
valueContainer = new ValueContainer();
valueContainer.value = "setByA";
}
}
class B {
private ValueContainer valueContainer;
public B () {
valueContainer = new ValueContainer();
valueContainer.value = "setByB";
}
}
Run Code Online (Sandbox Code Playgroud)
我设置了一个观察点value,我只希望断点只有在value由A类设置并且忽略B的调用时才挂起.
更糟糕的是,类SizeRequirement是swing库的一部分,并且深深地集成在代码中,因此我无法使用继承来替换某些孩子在我想跟踪它的某个确切位置.
编辑
所以这就是我用作条件断点条件的东西.信不信由你,它的确有效.:)
StackTraceElement[] arr = Thread.currentThread().getStackTrace();
boolean contains = false;
for(StackTraceElement e : arr) {
if (e.getClassName().contains("A")) {
contains = true; …Run Code Online (Sandbox Code Playgroud) 说我有以下代码示例.我有DataFiller的接口和它的2个实现.每个实现都采用不同类型的容器.
public interface DataFiller {
public void fillContainer(Object param1, Object param2 Object container);
}
public class InOrderDataFiller implements DataFiller {
@Override
public void fillContainer(Object param1, Object param2, Object container) {
if (container instanceof InOrderContainer) {
container.setContent1(param1);
container.setContent2(param2);
}
}
}
public class ReverseDataFiller implements DataFiller {
@Override
public void fillContainer(Object param1, Object param2, Object container) {
if (container instanceof ReverseContainer) {
container.setContent1(param2);
container.setContent2(param1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了确保我可以填充它们,我需要使用instanceof检查容器的数据类型.我想知道,如果有办法,如何有更优雅的代码,比如静态类型检查.有没有办法,如何在DataFiller的具体实现中指定容器的数据类型?我希望代码更像这样(当然这不会编译):
public interface DataFiller {
public void fillContainer(Object param1, Object param2 Container container);
} …Run Code Online (Sandbox Code Playgroud) 经过一番快速搜索,我无法找到明确的答案.
是否有一些更优雅的方法来同步整个类的整个成员方法(绑定在实例上)?这意味着可以通过多个线程在多个实例上调用方法,但是当时只能由一个线程调用.它也可以写为同步块.
(例如,该方法将其实例插入共享缓存中.)
class DataObject {
public putInCache() {
synchronized(getClass()) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
}
Run Code Online (Sandbox Code Playgroud) java ×3
debugging ×1
eclipse ×1
inheritance ×1
interface ×1
polymorphism ×1
synchronized ×1
watchpoint ×1