📄 dynamicmbeanproxy.java
字号:
String name=methods[j].getName(); if( name.startsWith( "get" ) ) { if( methods[j].getParameterTypes().length != 0 ) { continue; } if( ! Modifier.isPublic( methods[j].getModifiers() ) ) { //log.debug("not public " + methods[j] ); continue; } Class ret=methods[j].getReturnType(); if( ! supportedType( ret ) ) { if( log.isDebugEnabled() ) log.debug("Unsupported " + ret ); continue; } name=unCapitalize( name.substring(3)); getAttMap.put( name, methods[j] ); // just a marker, we don't use the value attMap.put( name, methods[j] ); } else if( name.startsWith( "is" ) ) { // not used in our code. Add later } else if( name.startsWith( "set" ) ) { Class params[]=methods[j].getParameterTypes(); if( params.length != 1 ) { continue; } if( ! Modifier.isPublic( methods[j].getModifiers() ) ) continue; Class ret=params[0]; if( ! supportedType( ret ) ) { continue; } name=unCapitalize( name.substring(3)); setAttMap.put( name, methods[j] ); attMap.put( name, methods[j] ); } else { if( methods[j].getParameterTypes().length != 0 ) { continue; } if( methods[j].getDeclaringClass() == Object.class ) continue; if( ! Modifier.isPublic( methods[j].getModifiers() ) ) continue; invokeAttMap.put( name, methods[j]); } } } /** * @todo Find if the 'className' is the name of the MBean or * the real class ( I suppose first ) * @todo Read (optional) descriptions from a .properties, generated * from source * @todo Deal with constructors * */ public MBeanInfo getMBeanInfo() { if( methods==null ) { init(); } try { MBeanAttributeInfo attributes[]=new MBeanAttributeInfo[attMap.size()]; Enumeration en=attMap.keys(); int i=0; while( en.hasMoreElements() ) { String name=(String)en.nextElement(); attributes[i++]=new MBeanAttributeInfo(name, "Attribute " + name , (Method)getAttMap.get(name), (Method)setAttMap.get(name)); } MBeanOperationInfo operations[]=new MBeanOperationInfo[invokeAttMap.size()]; en=invokeAttMap.keys(); i=0; while( en.hasMoreElements() ) { String name=(String)en.nextElement(); Method m=(Method)invokeAttMap.get(name); if( m!=null && name != null ) { operations[i++]=new MBeanOperationInfo(name, m); } else { System.out.println("Null arg " + name + " " + m ); } } if( log.isDebugEnabled() ) log.debug(real.getClass().getName() + " getMBeanInfo()"); return new MBeanInfo( real.getClass().getName(), /* ??? */ "MBean for " + getName(), attributes, new MBeanConstructorInfo[0], operations, new MBeanNotificationInfo[0]); } catch( Exception ex ) { ex.printStackTrace(); return null; } } static final Object[] NO_ARGS_PARAM=new Object[0]; public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if( methods==null ) init(); Method m=(Method)getAttMap.get( attribute ); if( m==null ) throw new AttributeNotFoundException(attribute); try { if( log.isDebugEnabled() ) log.debug(real.getClass().getName() + " getAttribute " + attribute); return m.invoke(real, NO_ARGS_PARAM ); } catch( IllegalAccessException ex ) { ex.printStackTrace(); throw new MBeanException( ex ); } catch( InvocationTargetException ex1 ) { ex1.printStackTrace(); throw new MBeanException( ex1 ); } } public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { if( methods==null ) init(); // XXX Send notification !!! Method m=(Method)setAttMap.get( attribute.getName() ); if( m==null ) throw new AttributeNotFoundException(attribute.getName()); try { log.info(real.getClass().getName() + "setAttribute " + attribute.getName()); m.invoke(real, new Object[] { attribute.getValue() } ); } catch( IllegalAccessException ex ) { ex.printStackTrace(); throw new MBeanException( ex ); } catch( InvocationTargetException ex1 ) { ex1.printStackTrace(); throw new MBeanException( ex1 ); } } /** * Invoke a method. Only no param methods are supported at the moment * ( init, start, execute, etc ) ( that's the most common pattern we have * in tomcat/ant/etc ) * * @todo Implement invoke for methods with more arguments. */ public Object invoke(String method, Object[] arguments, String[] params) throws MBeanException, ReflectionException { if( methods==null ) init(); Method m=(Method)invokeAttMap.get( method ); if( m==null ) return null; try { log.info(real.getClass().getName() + "invoke " + m.getName()); return m.invoke(real, NO_ARGS_PARAM ); } catch( IllegalAccessException ex ) { throw new MBeanException( ex ); } catch( InvocationTargetException ex1 ) { throw new MBeanException( ex1 ); } } // -------------------- Auxiliary methods -------------------- public AttributeList setAttributes(AttributeList attributes) { Iterator attE=attributes.iterator(); while( attE.hasNext() ) { Attribute att=(Attribute)attE.next(); try { setAttribute( att ); } catch( Exception ex ) { ex.printStackTrace(); } } return attributes; } public AttributeList getAttributes(String[] attributes) { AttributeList al=new AttributeList(); if( attributes==null ) return null; for( int i=0; i<attributes.length; i++ ) { try { Attribute att=new Attribute( attributes[i], getAttribute( attributes[i] )); al.add( att ); } catch( Exception ex ) { ex.printStackTrace(); } } return al; } // -------------------- Utils -------------------- public static String unCapitalize(String name) { if (name == null || name.length() == 0) { return name; } char chars[] = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); } private static org.apache.commons.logging.Log log= org.apache.commons.logging.LogFactory.getLog( DynamicMBeanProxy.class );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -