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.policy.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 class MethodUtil { |
37 class MethodUtil { |
38 |
38 |
39 private static final Logger LOGGER = Logger.getLogger(MethodUtil.class.getName()); |
39 private static final Logger LOGGER = Logger.getLogger(MethodUtil.class.getName()); |
40 private static final Method INVOKE_METHOD; |
|
41 |
|
42 static { |
|
43 Method method; |
|
44 try { |
|
45 Class<?> clazz = Class.forName("sun.reflect.misc.MethodUtil"); |
|
46 method = clazz.getMethod("invoke", Method.class, Object.class, Object[].class); |
|
47 if (LOGGER.isLoggable(Level.FINE)) { |
|
48 LOGGER.log(Level.FINE, "Class sun.reflect.misc.MethodUtil found; it will be used to invoke methods."); |
|
49 } |
|
50 } catch (Throwable t) { |
|
51 method = null; |
|
52 if (LOGGER.isLoggable(Level.FINE)) { |
|
53 LOGGER.log(Level.FINE, "Class sun.reflect.misc.MethodUtil not found, probably non-Oracle JVM"); |
|
54 } |
|
55 } |
|
56 INVOKE_METHOD = method; |
|
57 } |
|
58 |
40 |
59 static Object invoke(Object target, Method method, Object[] args) throws IllegalAccessException, InvocationTargetException { |
41 static Object invoke(Object target, Method method, Object[] args) throws IllegalAccessException, InvocationTargetException { |
60 if (INVOKE_METHOD != null) { |
42 if (LOGGER.isLoggable(Level.FINE)) { |
61 // sun.reflect.misc.MethodUtil.invoke(method, owner, args) |
43 LOGGER.log(Level.FINE, "Invoking method using com.sun.xml.internal.ws.policy.util.MethodUtil"); |
62 if (LOGGER.isLoggable(Level.FINE)) { |
44 } |
63 LOGGER.log(Level.FINE, "Invoking method using sun.reflect.misc.MethodUtil"); |
45 try { |
64 } |
46 return com.sun.xml.internal.ws.policy.util.MethodUtil.invoke(method, target, args); |
65 try { |
47 } catch (InvocationTargetException ite) { |
66 return INVOKE_METHOD.invoke(null, method, target, args); |
48 // unwrap invocation exception added by reflection code ... |
67 } catch (InvocationTargetException ite) { |
49 throw unwrapException(ite); |
68 // unwrap invocation exception added by reflection code ... |
|
69 throw unwrapException(ite); |
|
70 } |
|
71 } else { |
|
72 // other then Oracle JDK ... |
|
73 if (LOGGER.isLoggable(Level.FINE)) { |
|
74 LOGGER.log(Level.FINE, "Invoking method directly, probably non-Oracle JVM"); |
|
75 } |
|
76 return method.invoke(target, args); |
|
77 } |
50 } |
78 } |
51 } |
79 |
52 |
80 private static InvocationTargetException unwrapException(InvocationTargetException ite) { |
53 private static InvocationTargetException unwrapException(InvocationTargetException ite) { |
81 Throwable targetException = ite.getTargetException(); |
54 Throwable targetException = ite.getTargetException(); |