| /* |
| * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /* This test essentially duplicates the functionality of MXBeanTest.java. |
| * See LeakTest.java for an explanation. |
| */ |
| |
| import java.lang.reflect.Field; |
| import java.lang.reflect.InvocationHandler; |
| import java.lang.reflect.InvocationTargetException; |
| import java.lang.reflect.Method; |
| import java.lang.reflect.Proxy; |
| import java.util.HashMap; |
| import java.util.Map; |
| import javax.management.InstanceAlreadyExistsException; |
| import javax.management.JMX; |
| import javax.management.MBeanRegistrationException; |
| import javax.management.MBeanServer; |
| import javax.management.MBeanServerFactory; |
| import javax.management.MalformedObjectNameException; |
| import javax.management.NotCompliantMBeanException; |
| import javax.management.ObjectName; |
| |
| public class RandomMXBeanTest { |
| public static interface StupidMXBean { |
| public int ZERO = Integer.parseInt("0"); |
| public int getZero(); |
| public int identity(int x); |
| } |
| |
| public static class StupidImpl implements StupidMXBean { |
| public int getZero() { |
| return 0; |
| } |
| |
| public int identity(int x) { |
| return x; |
| } |
| } |
| |
| public static interface ReferMXBean { |
| public StupidMXBean getStupid(); |
| } |
| |
| public static class ReferImpl implements ReferMXBean { |
| private final StupidMXBean stupid; |
| |
| ReferImpl(StupidMXBean stupid) { |
| this.stupid = stupid; |
| } |
| |
| public StupidMXBean getStupid() { |
| return stupid; |
| } |
| } |
| |
| private static class WrapInvocationHandler implements InvocationHandler { |
| private final Object wrapped; |
| |
| WrapInvocationHandler(Object wrapped) { |
| this.wrapped = wrapped; |
| } |
| |
| public Object invoke(Object proxy, Method method, Object[] args) |
| throws Throwable { |
| return method.invoke(wrapped, args); |
| } |
| } |
| |
| private static class DullInvocationHandler implements InvocationHandler { |
| private static Map<Class<?>, Object> zeroMap = |
| new HashMap<Class<?>, Object>(); |
| static { |
| zeroMap.put(byte.class, (byte) 0); |
| zeroMap.put(int.class, 0); |
| zeroMap.put(short.class, (short) 0); |
| zeroMap.put(long.class, 0L); |
| zeroMap.put(float.class, 0F); |
| zeroMap.put(double.class, 0.0); |
| zeroMap.put(boolean.class, false); |
| zeroMap.put(char.class, '\0'); |
| } |
| |
| public static Object zeroFor(Class<?> c) { |
| if (c.isPrimitive()) |
| return zeroMap.get(c); |
| else |
| return null; |
| } |
| |
| public Object invoke(Object proxy, Method method, Object[] args) |
| throws Throwable { |
| Class<?> retType = method.getReturnType(); |
| if (!retType.isPrimitive()) |
| return null; |
| return zeroMap.get(retType); |
| } |
| } |
| |
| public static void main(String[] args) throws Exception { |
| MBeanServer mbs = MBeanServerFactory.newMBeanServer(); |
| ObjectName name = new ObjectName("a:b=c"); |
| StupidMXBean stupid = new StupidImpl(); |
| mbs.registerMBean(stupid, name); |
| ObjectName referName = new ObjectName("a:c=d"); |
| mbs.registerMBean(new ReferImpl(stupid), referName); |
| System.out.println(mbs.getMBeanInfo(name)); |
| StupidMXBean stupid2 = (StupidMXBean) |
| Proxy.newProxyInstance(StupidMXBean.class.getClassLoader(), |
| new Class<?>[] {StupidMXBean.class}, |
| new WrapInvocationHandler(stupid)); |
| ObjectName stupidName2 = new ObjectName("a:d=e"); |
| mbs.registerMBean(stupid2, stupidName2); |
| Field zero = StupidMXBean.class.getField("ZERO"); |
| System.out.println("Zero field = " + zero.get(null)); |
| test(mbs, MerlinMXBean.class); |
| test(mbs, TigerMXBean.class); |
| |
| StupidMXBean proxy = JMX.newMXBeanProxy(mbs, name, StupidMXBean.class); |
| System.out.println("Zero = " + proxy.getZero()); |
| System.out.println("One = " + proxy.identity(1)); |
| ReferMXBean referProxy = |
| JMX.newMXBeanProxy(mbs, referName, ReferMXBean.class); |
| StupidMXBean stupidProxy2 = referProxy.getStupid(); |
| System.out.println("Same proxy: " + (proxy == stupidProxy2)); |
| Method[] methods = StupidMXBean.class.getMethods(); |
| for (Method method : methods) { |
| if (method.getParameterTypes().length == 0) |
| method.invoke(proxy, new Object[0]); |
| } |
| } |
| |
| private static <T> void test(MBeanServer mbs, Class<T> c) throws Exception { |
| System.out.println("Testing " + c.getName()); |
| T merlin = c.cast( |
| Proxy.newProxyInstance(c.getClassLoader(), |
| new Class<?>[] {c}, |
| new DullInvocationHandler())); |
| ObjectName merlinName = new ObjectName("a:type=" + c.getName()); |
| mbs.registerMBean(merlin, merlinName); |
| System.out.println(mbs.getMBeanInfo(merlinName)); |
| T merlinProxy = JMX.newMXBeanProxy(mbs, merlinName, c); |
| Method[] merlinMethods = c.getMethods(); |
| for (Method m : merlinMethods) { |
| Class<?>[] types = m.getParameterTypes(); |
| Object[] params = new Object[types.length]; |
| for (int i = 0; i < types.length; i++) |
| params[i] = DullInvocationHandler.zeroFor(types[i]); |
| System.out.println("Invoking " + m.getName()); |
| m.invoke(merlinProxy, (Object[]) params); |
| } |
| } |
| } |