java - 在 Eclipse 中制作自定义调试 watch 的最简单方法?

标签 java eclipse debugging

是否可以在 Eclipse 中创建自定义变量查看器?假设我希望分解位域或将位图视为图像。可能吗?

能举个最简单的例子吗?

更新

我尝试实现以下示例:http://alvinalexander.com/java/jwarehouse/eclipse/org.eclipse.jdt.debug.tests/test-plugin/org/eclipse/jdt/debug/testplugin/detailpane/SimpleDetailPane.java.shtml

我的plugin.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>

<plugin>
   <extension
         point="org.eclipse.debug.ui.detailPaneFactories">
      <detailFactories
            class="tests.debug.details.DetailPaneFactory"
            id="tests.debug.details.detailFactories">
      </detailFactories>
   </extension>



</plugin>

我的 DetailPaneFactory.java 如下:

package tests.debug.details;

import java.util.AbstractSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.eclipse.debug.ui.IDetailPane;
import org.eclipse.debug.ui.IDetailPaneFactory;
import org.eclipse.jface.viewers.IStructuredSelection;

public class DetailPaneFactory implements IDetailPaneFactory {

    private HashMap<String,Class<? extends IDetailPane>> classes = new HashMap<String,Class<? extends IDetailPane>>();

    private void addClass(Class<? extends IDetailPane> cls) {
        try {
            String paneID = (String) cls.getField("ID").get(null);
            classes.put(paneID, cls);
        } catch (IllegalArgumentException | IllegalAccessException
                | NoSuchFieldException | SecurityException e) {
            throw new RuntimeException(e);
        }
        finally {

        }

    }

    private Class<? extends IDetailPane> getClass(String paneID) {
        Class<? extends IDetailPane> ans = classes.get(paneID);
        return ans;
    }

    public DetailPaneFactory() {
        addClass(SimpleDetailPane.class);
    }


    @Override
    public IDetailPane createDetailPane(String paneID) {

        Class<? extends IDetailPane> cls = getClass(paneID);
        if( cls != null ) {
            try {
                return cls.newInstance();
            } catch (InstantiationException | IllegalAccessException e) {
                throw new RuntimeException();
            }
        }
        else {
            return null;
        }
    }

    @Override
    public String getDetailPaneName(String paneID) {
        Class<? extends IDetailPane> cls = getClass(paneID);
        if( cls != null ) {
            try {
                return (String)cls.getField("NAME").get(null);
            } catch (IllegalArgumentException | IllegalAccessException
                    | NoSuchFieldException | SecurityException e) {
                throw new RuntimeException(e);
            }
        }
        else {
            return null;
        }
    }

    @Override
    public String getDetailPaneDescription(String paneID) {
        Class<? extends IDetailPane> cls = getClass(paneID);
        if( cls != null ) {
            try {
                return (String)cls.getField("DESCRIPTION").get(null);
            } catch (IllegalArgumentException | IllegalAccessException
                    | NoSuchFieldException | SecurityException e) {
                throw new RuntimeException(e);
            }
        }
        else {
            return null;
        }
    }

    @Override
    public Set<String> getDetailPaneTypes(IStructuredSelection selection) {
        return new AbstractSet<String>() {

            @Override
            public Iterator<String> iterator() {
                return new Iterator<String>() {

                    private Iterator<Map.Entry<String,Class<? extends IDetailPane>>> it = classes.entrySet().iterator();

                    @Override
                    public void remove() {
                        it.remove();
                    }

                    @Override
                    public String next() {
                        return it.next().getKey();
                    }

                    @Override
                    public boolean hasNext() {
                        return it.hasNext();
                    }
                };
            }

            @Override
            public int size() {
                return classes.size();
            }

        };
    }

    @Override
    public String getDefaultDetailPane(IStructuredSelection selection) {
        return SimpleDetailPane.ID;
    }

}

我的 SimpleDetailPane.java 与示例中的一样。

而且它显然有效。

最佳答案

您可以使用 Window/Show View/Expressions 并添加可以进行一些计算并显示文本输出的表达式。但是,除了文本输出之外,您还必须通过 Eclipse 平台扩展点提供您自己的模型表示。参见 Detail Pane Factories Extension以及 Eclipse 自己的 JDT 中 org.eclipse.temp.JavaTableDetailPaneFactory 类的源代码。

作为一种快速解决方法,您还可以编写一个静态实用程序方法,该方法将打开一个新窗口,其中包含从位域转换而来的图像,并使用 Ctrl-U 快捷键从显示 View 调用该方法。

关于java - 在 Eclipse 中制作自定义调试 watch 的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10521481/

相关文章:

java - 不同字段值长度的 Hibernate 标准

java - 如何在YouTube( WebView )中使用全屏显示?

java - nullPointerException 帮助 (android)

java - 仅包含图像的 ListView

eclipse - 如何在 Eclipse 中调试在 jetty 上运行的 Web 应用程序?

c - C : Declaration of Functions简介

c - 用编译语言编写的编译器如何处理错误?

java - Android,viewpager,每个布局都有自己的 Activity

java - 即使完成示例测试用例也无法得到正确答案

java - 是否可以使用birt框架绘制折线图?