public static Class getNestedPropertyType(DynaClass bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException, NoSuchFieldException { // Resolve nested references while (resolver.hasNested(name)) { String next = resolver.next(name); if (resolver.isIndexed(next) || resolver.isMapped(next)) { String property = resolver.getProperty(next); Class<?> clazz = Class.forName(bean.getName()); Class<?> detectTypeParameter = detectTypeParameter(clazz, property, resolver.isIndexed(name) ? 0 : 1); bean = WrapDynaClass.createDynaClass(detectTypeParameter); return getNestedPropertyType(bean, resolver.remove(name)); } DynaProperty db = bean.getDynaProperty(next); bean = WrapDynaClass.createDynaClass(db.getType()); name = resolver.remove(name); } if (resolver.isMapped(name) || resolver.isIndexed(name)) { String property = resolver.getProperty(name); Class<?> clazz = Class.forName(bean.getName()); return detectTypeParameter(clazz, property, resolver.isIndexed(name) ? 0 : 1); } Class<?> type = bean.getDynaProperty(name).getType(); return type; }
/** * Test DynaClass of a RemoteBean. * * @throws Exception */ public void testGetDynaClass() throws Exception { MyBean sampleBean = new MyBean(); ServerContext serverContext = new ServerContextImpl(sampleBean, sm, new OurHierarchicalRegistry()); OddjobMBean test = new OddjobMBean( sampleBean, OddjobMBeanFactory.objectName(0), new OurServerSession(), serverContext); DynaClass dc = (DynaClass) test.invoke("getDynaClass", new Object[] {}, new String[] {}); assertNotNull(dc); DynaProperty dp = dc.getDynaProperty("fruit"); assertEquals(String.class, dp.getType()); }