1 /* |
1 /* |
2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. Oracle designates this |
7 * published by the Free Software Foundation. Oracle designates this |
29 import java.lang.reflect.Method; |
29 import java.lang.reflect.Method; |
30 import java.util.logging.Level; |
30 import java.util.logging.Level; |
31 import java.util.logging.Logger; |
31 import java.util.logging.Logger; |
32 |
32 |
33 /** |
33 /** |
34 * Utility class to invoke sun.reflect.misc.MethodUtil.invoke() if available. If not (other then Oracle JDK) fallbacks |
34 * Utility class to invoke com.sun.xml.internal.ws.util.MethodUtil.invoke() if available. If not (other then Oracle JDK) fallbacks |
35 * to java.lang,reflect.Method.invoke() |
35 * to java.lang,reflect.Method.invoke() |
36 * |
36 * |
37 * Be careful, copy of this class exists in several packages, iny modification must be done to other copies too! |
37 * Be careful, copy of this class exists in several packages, iny modification must be done to other copies too! |
38 */ |
38 */ |
39 class MethodUtil { |
39 class MethodUtil { |
40 |
40 |
41 private static final Logger LOGGER = Logger.getLogger(MethodUtil.class.getName()); |
41 private static final Logger LOGGER = Logger.getLogger(MethodUtil.class.getName()); |
42 private static final Method INVOKE_METHOD; |
|
43 |
|
44 static { |
|
45 Method method; |
|
46 try { |
|
47 Class<?> clazz = Class.forName("sun.reflect.misc.MethodUtil"); |
|
48 method = clazz.getMethod("invoke", Method.class, Object.class, Object[].class); |
|
49 if (LOGGER.isLoggable(Level.FINE)) { |
|
50 LOGGER.log(Level.FINE, "Class sun.reflect.misc.MethodUtil found; it will be used to invoke methods."); |
|
51 } |
|
52 } catch (Throwable t) { |
|
53 method = null; |
|
54 if (LOGGER.isLoggable(Level.FINE)) { |
|
55 LOGGER.log(Level.FINE, "Class sun.reflect.misc.MethodUtil not found, probably non-Oracle JVM"); |
|
56 } |
|
57 } |
|
58 INVOKE_METHOD = method; |
|
59 } |
|
60 |
42 |
61 static Object invoke(Object target, Method method, Object[] args) throws IllegalAccessException, InvocationTargetException { |
43 static Object invoke(Object target, Method method, Object[] args) throws IllegalAccessException, InvocationTargetException { |
62 if (INVOKE_METHOD != null) { |
44 // com.sun.xml.internal.ws.util.MethodUtil.invoke(method, owner, args) |
63 // sun.reflect.misc.MethodUtil.invoke(method, owner, args) |
45 if (LOGGER.isLoggable(Level.FINE)) { |
64 if (LOGGER.isLoggable(Level.FINE)) { |
46 LOGGER.log(Level.FINE, "Invoking method using com.sun.xml.internal.ws.util.MethodUtil"); |
65 LOGGER.log(Level.FINE, "Invoking method using sun.reflect.misc.MethodUtil"); |
47 } |
66 } |
48 try { |
67 try { |
49 return com.sun.xml.internal.ws.util.MethodUtil.invoke(method, target, args); |
68 return INVOKE_METHOD.invoke(null, method, target, args); |
50 } catch (InvocationTargetException ite) { |
69 } catch (InvocationTargetException ite) { |
51 // unwrap invocation exception added by reflection code ... |
70 // unwrap invocation exception added by reflection code ... |
52 throw unwrapException(ite); |
71 throw unwrapException(ite); |
|
72 } |
|
73 } else { |
|
74 // other then Oracle JDK ... |
|
75 if (LOGGER.isLoggable(Level.FINE)) { |
|
76 LOGGER.log(Level.FINE, "Invoking method directly, probably non-Oracle JVM"); |
|
77 } |
|
78 return method.invoke(target, args); |
|
79 } |
53 } |
80 } |
54 } |
81 |
55 |
82 private static InvocationTargetException unwrapException(InvocationTargetException ite) { |
56 private static InvocationTargetException unwrapException(InvocationTargetException ite) { |
83 Throwable targetException = ite.getTargetException(); |
57 Throwable targetException = ite.getTargetException(); |