Class BCELMBeanInvoker

  extended bymx4j.server.ReflectionMBeanInvoker
      extended bymx4j.server.CachingReflectionMBeanInvoker
          extended bymx4j.server.BCELMBeanInvoker
All Implemented Interfaces:

public class BCELMBeanInvoker
extends CachingReflectionMBeanInvoker

MBeanInvoker that generates on-the-fly implementations to call standard MBeans directly, instead of using reflection.
It uses the BCEL to generate the required bytecode on-the-fly. The generated class is named "mx4j.server.BCELMBeanInvokerGenerated", and it's loaded into the JVM by a different classloader for each MBean. This classloader has the MBean classloader as parent.
Below is an example of the generated code; beware that the management interface and all parameter's classes must be public, otherwise an IllegalAccessError is thrown and the invocation falls back to use reflection (but with a significant overhead - throwing an exception is expensive).

 public interface ServiceMBean
    public void start();
    public Collection getServices(ServiceSelector selector);

public class BCELMBeanInvokerGenerated extends BCELMBeanInvoker { protected Object invokeImpl(MBeanMetaData metadata, String method, String[] signature, Object[] args) throws Throwable { if (method.equals("start") && args.length == 0) { try { ((ServiceMBean)metadata.mbean).start(); return null; } catch (ClassCastException x) {} catch (IllegalAccessError x) {} } else if (method.equals("getServices") && args.length == 1) { try { return ((ServiceMBean)metadata.mbean).getServices((ServiceSelector)args[0]); } catch (ClassCastException x) {} catch (IllegalAccessError x) {} } return super.invokeImpl(metadata, method, signature, args); } }

$Revision: 1.14 $

Field Summary
Fields inherited from class mx4j.server.ReflectionMBeanInvoker
Constructor Summary
protected BCELMBeanInvoker()
Method Summary
static MBeanInvoker create(MBeanMetaData metadata)
          Creates a new MBeanInvoker created on-the-fly by using BCEL.
protected  java.lang.Object invokeImpl(MBeanMetaData metadata, java.lang.String method, java.lang.String[] signature, java.lang.Object[] args)
          Performs the actual invocation of the MBean's method.
Methods inherited from class mx4j.server.CachingReflectionMBeanInvoker
getMethodForAttribute, getStandardAttributeInfo, getStandardManagementMethod, getStandardOperationInfo
Methods inherited from class mx4j.server.ReflectionMBeanInvoker
doInvoke, getAttribute, invoke, setAttribute
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructor Detail


protected BCELMBeanInvoker()
Method Detail


public static MBeanInvoker create(MBeanMetaData metadata)
Creates a new MBeanInvoker created on-the-fly by using BCEL. It must be synchronized since BCEL is not thread safe, and uses static variables (refer to org.apache.bcel.generic.Type.getArgumentTypes(...) for further details)


protected java.lang.Object invokeImpl(MBeanMetaData metadata,
                                      java.lang.String method,
                                      java.lang.String[] signature,
                                      java.lang.Object[] args)
                               throws java.lang.Throwable
Description copied from class: ReflectionMBeanInvoker
Performs the actual invocation of the MBean's method. Exceptions thrown by the MBean's methods should not be catched, since ReflectionMBeanInvoker.doInvoke(mx4j.server.MBeanMetaData, java.lang.String, java.lang.String[], java.lang.Object[]) takes care of converting them to JMX exceptions.

invokeImpl in class ReflectionMBeanInvoker

Copyright © 2001-2005 The MX4J Contributors. All Rights Reserved.