JMXBeanWrapper 无法使用修饰符 "public" 访问 class "JMX" 的成员

JMXBeanWrapper can not access a member of class "JMX" with modifiers "public"

我正在尝试使用 JMXWrapper class/project

对于一组 JMX 的当前项目 classes 所有这些都可以在 JConsole 或 VisualVM 上正常工作

对于其中一个,我尝试改编或使用 JMXWrapper:

public interface MainJmxMBean {

    boolean showIfMainIsRunning();

    void stopMain();

}

@JMXBean(description="Administrates the Main app", sorted=true)
class MainJmx implements MainJmxMBean {

    private boolean isMainRunning;

    MainJmx() {
        isMainRunning =true;
    }


    @Override
    @JMXBeanOperation(name="Show If Main Is Running",
                      description="Shows if the Main app is running or not",
                      sortValue="1")
    public boolean showIfMainIsRunning() {
        return isMainRunning;
    }


    @Override
    @JMXBeanOperation(description="Stops the Main app", sortValue="2")
    public void stopMain() {
        isMainRunning = false;
    }

}

注意: 上面显示的 class 在没有注释的情况下工作正常。现在已注释以改进信息及其在 JConsole/VisualVM

中的使用

最后

private void registerMBeanWithJMXBeanWrapper(ObjectJmxMBean objectJmxMBean) {

    try {
        //System.out.printf("%s %n", objectJmxMBean.toString());
        ObjectName objectName = new ObjectName(objectJmxMBean.getName());
        server.registerMBean(new JMXBeanWrapper(objectJmxMBean.getObject()), objectName);
    }
    catch(MalformedObjectNameException |
          InstanceAlreadyExistsException |
          MBeanRegistrationException |
          NotCompliantMBeanException |
          IntrospectionException e) {
        System.err.printf("[CanonicalName] %s - ERROR: %s %n", e.getClass().getCanonicalName(), e.getMessage());
    }

}

上面的重要部分是:new JMXBeanWrapper(objectJmxMBean.getObject())

直到这里,我确实按照 post 顶部 link 中共享的 JMXBeanWrapper 文档,甚至作者的 post 中的文档,执行了所有说明:

当我 运行 主应用程序时,通过 JConsole 或 VisualVM,我可以看到正在应用的注释和预期的工作方式,因此直到这里目标似乎已经完成。

问题:问题是当我点击它们中的任何一个时出现:

完整的错误信息是:

Problem invoking stopMain: 
java.lang.IllegalAccessException 
Class com.udojava.jmx.wrapper.JMXBeanWrapper can not access a member of class 
com.manuel.jordan.jmx.admin.MainJmx with modifiers "public"

观察: 似乎错误是由JConsole或VisualVM直接抛出的,因为根据JMXBeanWrapper.java源代码, throw new IllegalAccessException 消息的一部分没有 with modifiers "public"

语句

注意和观察: 根据 Github 上共享的项目,它是用 JDK 6 测试的,我是 using/working JDK8.

配置中可能有什么错误或缺失?

解决方法如下:

编辑自:

@JMXBean(description="Administrates the Main app", sorted=true)
class MainJmx implements MainJmxMBean {

    private boolean isMainRunning;

    MainJmx() {
        isMainRunning =true;
    }

@JMXBean(description="Administrates the Main app", sorted=true)
public class MainJmx implements MainJmxMBean {

    private boolean isMainRunning;

    MainJmx() {
        isMainRunning =true;
    }

结论:JMXWrapper需要注解@JMXBean的class一定是public.

你怎么看构造函数可以保持package default