Module java.management
Package javax.management

Class MBeanServerInvocationHandler

java.lang.Object
javax.management.MBeanServerInvocationHandler
所有已实现的接口:
InvocationHandler

public class MBeanServerInvocationHandler extends Object implements InvocationHandler

InvocationHandler将MBean的管理接口中的方法通过MBean服务器转发到MBean。

给定一个MBeanServerConnection,该MBean服务器中的MBean的ObjectName,以及描述MBean管理接口的Java接口Intf,使用标准MBean或MXBean的模式,可以使用此类来构造MBean的代理。代理实现接口Intf,以便将其所有方法通过MBean服务器转发到MBean。

如果InvocationHandler用于MXBean,则方法的参数将从在MXBean接口中声明的类型转换为相应的映射类型,并且返回值将从映射类型转换为声明的类型。例如,对于方法
public List<String> reverse(List<String> list);
并且假设List<String>的映射类型为 String[],调用proxy.reverse(someList)someListList<String>转换为String[],调用MBean操作reverse,然后将返回的String[]转换为List<String>

当在使用此调用处理程序的代理上调用Object.toString()、Object.hashCode()或Object.equals(Object)时,仅当它出现在代理的一个接口中时,才将其转发到MBean服务器作为代理MBean上的方法。对于使用JMX.newMBeanProxyJMX.newMXBeanProxy创建的代理,这意味着该方法必须出现在标准MBean或MXBean接口中。否则,这些方法具有以下行为:

  • toString()返回代理的字符串表示
  • hashCode()返回代理的哈希码,使得两个相等的代理具有相同的哈希码
  • equals(Object)仅当Object参数与此代理的相同代理类,具有相同的MBeanServerConnection和ObjectName的MBeanServerInvocationHandler时,才返回true;如果一个MBeanServerInvocationHandler是使用Class参数构造的,则另一个必须使用相同的Class构造equals才会返回true。
自1.5版本起:
1.5
  • Constructor Details

    • MBeanServerInvocationHandler

      public MBeanServerInvocationHandler(MBeanServerConnection connection, ObjectName objectName)

      将方法通过MBean服务器转发到标准MBean的调用处理程序。可以调用此构造函数,而不是依赖于JMX.newMBeanProxy,例如,如果需要为ClassLoader提供不同的Proxy.newProxyInstance

      此构造函数不适用于MXBean。对于MXBean,请使用MBeanServerInvocationHandler(MBeanServerConnection, ObjectName, boolean)。此构造函数等效于new MBeanServerInvocationHandler(connection, objectName, false)

      参数:
      connection - 通过该处理程序转发使用该处理程序的代理的所有方法的MBean服务器连接。
      objectName - 将要转发方法的MBean在MBean服务器中的名称。
    • MBeanServerInvocationHandler

      public MBeanServerInvocationHandler(MBeanServerConnection connection, ObjectName objectName, boolean isMXBean)

      可以将方法通过MBean服务器转发到标准MBean或MXBean的调用处理程序。可以调用此构造函数,而不是依赖于JMX.newMXBeanProxy,例如,如果需要为ClassLoader提供不同的Proxy.newProxyInstance

      参数:
      connection - 通过该处理程序转发使用该处理程序的代理的所有方法的MBean服务器连接。
      objectName - 将要转发方法的MBean在MBean服务器中的名称。
      isMXBean - 如果为true,则代理是用于MXBean,并且将适当的映射应用于方法参数和返回值。
      自1.6版本起:
      1.6
  • Method Details

    • getMBeanServerConnection

      public MBeanServerConnection getMBeanServerConnection()

      通过该处理程序转发使用该处理程序的代理的方法的MBean服务器连接。

      返回:
      MBean服务器连接。
      自1.6版本起:
      1.6
    • getObjectName

      public ObjectName getObjectName()

      将方法转发到MBean服务器中的MBean的名称。

      返回:
      对象名称。
      自1.6版本起:
      1.6
    • isMXBean

      public boolean isMXBean()

      如果为true,则代理是用于MXBean,并且将适当的映射应用于方法参数和返回值。

      返回:
      代理是否用于MXBean。
      自1.6版本起:
      1.6
    • newProxyInstance

      public static <T> T newProxyInstance(MBeanServerConnection connection, ObjectName objectName, Class<T> interfaceClass, boolean notificationBroadcaster)

      返回一个代理,通过该代理实现给定的接口,将其方法通过给定的MBean服务器转发到指定的MBean。从1.6版本开始,优先使用方法JMX.newMBeanProxy(MBeanServerConnection, ObjectName, Class)JMX.newMBeanProxy(MBeanServerConnection, ObjectName, Class, boolean),而不是使用此方法。

      此方法等效于Proxy.newProxyInstance(interfaceClass.getClassLoader(), interfaces, handler)。这里handlernew MBeanServerInvocationHandler(connection, objectName)的结果,interfaces是一个数组,如果notificationBroadcaster为false,则有一个元素,如果为true,则有两个元素。 interfaces的第一个元素是interfaceClass,如果存在第二个元素,则为NotificationEmitter.class

      类型参数:
      T - 允许编译器知道如果interfaceClass参数为MyMBean.class,则返回类型为MyMBean
      参数:
      connection - 要转发到的MBean服务器。
      objectName - 要转发到connection中的MBean的名称。
      interfaceClass - MBean导出的管理接口,也将由返回的代理实现。
      notificationBroadcaster - 通过connection转发其方法,使返回的代理实现NotificationEmitter。在代理上调用NotificationBroadcaster.addNotificationListener(javax.management.NotificationListener, javax.management.NotificationFilter, java.lang.Object)将导致调用MBeanServerConnection.addNotificationListener(ObjectName, NotificationListener, NotificationFilter, Object),其他方法也类似,NotificationBroadcasterNotificationEmitter的其他方法也是如此。
      返回:
      新的代理实例。
      参见:
    • invoke

      public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
      从接口复制的描述: InvocationHandler
      处理代理实例上的方法调用,并返回结果。当在与其关联的代理实例上调用方法时,此方法将在调用处理程序上调用。
      指定者:
      invoke 在接口 InvocationHandler
      参数:
      proxy - 调用方法的代理实例
      method - 与代理实例上调用的接口方法对应的Method实例。 Method对象的声明类将是声明该方法的接口,该接口可能是代理接口的超接口,代理类通过该接口继承该方法。
      args - 包含在代理实例上方法调用中传递的参数值的对象数组,如果接口方法不带参数,则为null。 基本类型的参数将包装在适当的基本包装类的实例中,例如java.lang.Integerjava.lang.Boolean
      返回值:
      从代理实例上的方法调用返回的值。 如果接口方法的声明返回类型是基本类型,则此方法返回的值必须是相应基本包装类的实例;否则,它必须是可分配给声明的返回类型的类型。 如果此方法返回的值为null且接口方法的返回类型为基本类型,则代理实例上的方法调用将引发NullPointerException。 如果此方法返回的值与上述描述的接口方法的声明返回类型不兼容,则代理实例上的方法调用将引发ClassCastException
      抛出:
      Throwable - 从代理实例上的方法调用中抛出的异常。 异常的类型必须可分配给接口方法的throws子句中声明的任何异常类型,或者可分配给未经检查的异常类型java.lang.RuntimeExceptionjava.lang.Error。 如果此方法抛出了一个未在接口方法的throws子句中声明的任何异常类型,则代理实例上的方法调用将抛出一个包含此方法抛出的异常的UndeclaredThrowableException
      参见: