38package com.jogamp.common.util;
40import java.lang.reflect.Constructor;
41import java.lang.reflect.InvocationTargetException;
42import java.lang.reflect.Method;
43import java.util.HashMap;
44import java.util.Iterator;
45import java.util.Locale;
47import java.util.Map.Entry;
50import jogamp.common.Debug;
52import com.jogamp.common.ExceptionUtils;
53import com.jogamp.common.JogampRuntimeException;
54import com.jogamp.common.os.Clock;
58 public static final boolean DEBUG;
61 private static final Object forNameLock;
62 private static final Map<String, ClassNameLookup> forNameStats;
63 private static int forNameCount = 0;
64 private static long forNameNanoCosts = 0;
67 Debug.initSingleton();
68 DEBUG = Debug.debug(
"ReflectionUtil");
71 forNameLock =
new Object();
72 forNameStats =
new HashMap<String, ClassNameLookup>();
84 private static final Class<?>[] zeroTypes =
new Class[0];
86 private static class ClassNameLookup {
87 public ClassNameLookup(
final String name) {
92 public final String name;
93 public long nanoCosts;
96 public String toString() {
97 return String.format((Locale)
null,
"%8.3f ms, %03d invoc, %s", nanoCosts/1e6, count, name);
102 synchronized(forNameLock) {
105 forNameStats.clear();
111 sb =
new StringBuilder();
114 synchronized(forNameLock) {
115 sb.append(String.format(
"ReflectionUtil.forName: %8.3f ms, %03d invoc%n", forNameNanoCosts/1e6, forNameCount));
116 final Set<Entry<String, ClassNameLookup>> entries = forNameStats.entrySet();
118 for(
final Iterator<Entry<String, ClassNameLookup>> iter = entries.iterator(); iter.hasNext(); entryNum++) {
119 final Entry<String, ClassNameLookup> entry = iter.next();
120 sb.append(String.format(
"ReflectionUtil.forName[%03d]: %s%n", entryNum, entry.getValue()));
127 private static Class<?> getClassImpl(
final String clazzName,
final boolean initializeClazz,
final ClassLoader cl)
throws ClassNotFoundException {
130 final Class<?> res = Class.forName(clazzName, initializeClazz, cl);
132 final long nanoCosts = t1 - t0;
133 synchronized(forNameLock) {
135 forNameNanoCosts += nanoCosts;
136 ClassNameLookup cnl = forNameStats.get(clazzName);
138 cnl =
new ClassNameLookup(clazzName);
139 forNameStats.put(clazzName, cnl);
142 cnl.nanoCosts += nanoCosts;
143 System.err.printf(
"ReflectionUtil.getClassImpl.%03d: %8.3f ms, init %b, [%s]@ Thread %s%n",
144 forNameCount, nanoCosts/1e6, initializeClazz, cnl.toString(), Thread.currentThread().getName());
151 return Class.forName(clazzName, initializeClazz, cl);
158 public static final boolean isClassAvailable(
final String clazzName,
final ClassLoader cl) {
160 return null != getClassImpl(clazzName,
false, cl);
161 }
catch (
final ClassNotFoundException e) {
170 public static final Class<?>
getClass(
final String clazzName,
final boolean initializeClazz,
final ClassLoader cl)
173 return getClassImpl(clazzName, initializeClazz, cl);
174 }
catch (
final ClassNotFoundException e) {
183 public static final Constructor<?>
getConstructor(
final String clazzName,
final Class<?>[] cstrArgTypes,
final boolean initializeClazz,
final ClassLoader cl)
186 return getConstructor(getClassImpl(clazzName, initializeClazz, cl), cstrArgTypes);
187 }
catch (
final ClassNotFoundException ex) {
192 static final String asString(
final Class<?>[] argTypes) {
193 final StringBuilder args =
new StringBuilder();
194 boolean coma =
false;
195 if(
null != argTypes) {
196 for (
int i = 0; i < argTypes.length; i++) {
200 args.append(argTypes[i].getName());
204 return args.toString();
220 public static final Constructor<?>
getConstructor(
final Class<?> clazz, Class<?> ... cstrArgTypes)
222 if(
null == cstrArgTypes) {
223 cstrArgTypes = zeroTypes;
225 Constructor<?> cstr =
null;
227 cstr = clazz.getDeclaredConstructor(cstrArgTypes);
228 }
catch (
final NoSuchMethodException ex) {
232 final Constructor<?>[] cstrs = clazz.getConstructors();
233 for(
int i=0;
null==cstr && i<cstrs.length; i++) {
234 final Constructor<?> c = cstrs[i];
235 final Class<?>[] types = c.getParameterTypes();
236 if(types.length == cstrArgTypes.length) {
238 for(j=0; j<types.length; j++) {
239 if(!types[j].isAssignableFrom(cstrArgTypes[j])) {
243 if(types.length == j) {
250 throw new JogampRuntimeException(
"Constructor: '" + clazz.getName() +
"(" + asString(cstrArgTypes) +
")' not found");
255 public static final Constructor<?>
getConstructor(
final String clazzName,
final ClassLoader cl)
263 public static final Object
createInstance(
final Constructor<?> cstr,
final Object ... cstrArgs)
267 return cstr.newInstance(cstrArgs);
268 }
catch (
final Exception e) {
270 if (t instanceof InvocationTargetException) {
271 t = ((InvocationTargetException) t).getTargetException();
273 if (t instanceof Error) {
276 if (t instanceof RuntimeException) {
277 throw (RuntimeException) t;
286 public static final Object
createInstance(
final Class<?> clazz,
final Class<?>[] cstrArgTypes,
final Object ... cstrArgs)
292 public static final Object
createInstance(
final Class<?> clazz,
final Object ... cstrArgs)
295 Class<?>[] cstrArgTypes =
null;
297 cstrArgTypes =
new Class[cstrArgs.length];
298 for(
int i=0; i<cstrArgs.length; i++) {
299 cstrArgTypes[i] = cstrArgs[i].getClass();
305 public static final Object
createInstance(
final String clazzName,
final Class<?>[] cstrArgTypes,
final Object[] cstrArgs,
final ClassLoader cl)
309 return createInstance(getClassImpl(clazzName,
true, cl), cstrArgTypes, cstrArgs);
310 }
catch (
final ClassNotFoundException ex) {
315 public static final Object
createInstance(
final String clazzName,
final Object[] cstrArgs,
final ClassLoader cl)
318 Class<?>[] cstrArgTypes =
null;
320 cstrArgTypes =
new Class[cstrArgs.length];
321 for(
int i=0; i<cstrArgs.length; i++) {
322 cstrArgTypes[i] = cstrArgs[i].getClass();
328 public static final Object
createInstance(
final String clazzName,
final ClassLoader cl)
334 public static final boolean instanceOf(
final Object obj,
final String clazzName) {
337 public static final boolean instanceOf(Class<?> clazz,
final String clazzName) {
339 if(clazz.getName().equals(clazzName)) {
342 clazz = clazz.getSuperclass();
343 }
while (clazz!=
null);
352 final Class<?>[] clazzes = clazz.getInterfaces();
353 for(
int i=clazzes.length-1; i>=0; i--) {
354 final Class<?> face = clazzes[i];
355 if(face.getName().equals(faceName)) {
359 clazz = clazz.getSuperclass();
360 }
while (clazz!=
null);
375 public static final Method
getMethod(
final Class<?> clazz,
final String methodName,
final Class<?> ... argTypes)
381 m = clazz.getDeclaredMethod(methodName, argTypes);
382 }
catch (
final NoClassDefFoundError ex0) {
384 }
catch (
final NoSuchMethodException ex1) {
388 throw new JogampRuntimeException(
"Method: '" + clazz +
"." + methodName +
"(" + asString(argTypes) +
")' not found", t);
396 public static final Method
getMethod(
final String clazzName,
final String methodName,
final Class<?>[] argTypes,
final ClassLoader cl)
400 return getMethod(getClassImpl(clazzName,
true, cl), methodName, argTypes);
401 }
catch (
final ClassNotFoundException ex) {
414 public static final Object
callMethod(
final Object instance,
final Method method,
final Object ... args)
418 return method.invoke(instance, args);
419 }
catch (
final Exception e) {
421 if (t instanceof InvocationTargetException) {
422 t = ((InvocationTargetException) t).getTargetException();
424 if (t instanceof Error) {
427 if (t instanceof RuntimeException) {
428 throw (RuntimeException) t;
437 public static final Object
callStaticMethod(
final String clazzName,
final String methodName,
final Class<?>[] argTypes,
final Object[] args,
final ClassLoader cl)
448 public MethodAccessor(
final Class<?> clazz,
final String methodName,
final Class<?> ... argTypes) {
463 public Object
callMethod(
final Object instance,
final Object ... args) {
static void dumpStack(final PrintStream out)
A generic unchecked exception for Jogamp errors used throughout the binding as a substitute for Runti...
static native long currentNanos()
Returns current monotonic nanoseconds since start of this application.
Helper routines for accessing properties.
static final boolean isPropertyDefined(final String property, final boolean jnlpAlias)
static final String ComponentClass
static final String isHeadlessMethod
static final String GraphicsEnvironmentClass
Convenient Method access class.
Object callMethod(final Object instance, final Object ... args)
Check available() before calling to avoid throwing a JogampRuntimeException.
boolean available()
Returns true if method is available, otherwise false.
MethodAccessor(final Class<?> clazz, final String methodName, final Class<?> ... argTypes)
Check available() before using instance.
static final Method getMethod(final String clazzName, final String methodName, final Class<?>[] argTypes, final ClassLoader cl)
static final Method getMethod(final Class<?> clazz, final String methodName, final Class<?> ... argTypes)
static StringBuilder getForNameStats(StringBuilder sb)
static final Object createInstance(final String clazzName, final Class<?>[] cstrArgTypes, final Object[] cstrArgs, final ClassLoader cl)
static final Object callStaticMethod(final String clazzName, final String methodName, final Class<?>[] argTypes, final Object[] args, final ClassLoader cl)
static final boolean DEBUG
static final boolean instanceOf(final Object obj, final String clazzName)
static final Object createInstance(final Class<?> clazz, final Object ... cstrArgs)
static void resetForNameCount()
static final boolean implementationOf(final Object obj, final String faceName)
static final boolean isClassAvailable(final String clazzName, final ClassLoader cl)
Returns true only if the class could be loaded.
static final Object createInstance(final Constructor<?> cstr, final Object ... cstrArgs)
static final Object createInstance(final String clazzName, final ClassLoader cl)
static final Object createInstance(final Class<?> clazz, final Class<?>[] cstrArgTypes, final Object ... cstrArgs)
static final Object createInstance(final String clazzName, final Object[] cstrArgs, final ClassLoader cl)
static final boolean instanceOf(Class<?> clazz, final String clazzName)
static boolean isAWTComponent(final Class<?> clazz)
static final boolean DEBUG_STATS_FORNAME
static final Constructor<?> getConstructor(final String clazzName, final Class<?>[] cstrArgTypes, final boolean initializeClazz, final ClassLoader cl)
static final boolean implementationOf(Class<?> clazz, final String faceName)
static final Class<?> getClass(final String clazzName, final boolean initializeClazz, final ClassLoader cl)
Loads and returns the class or null.
static final Constructor<?> getConstructor(final String clazzName, final ClassLoader cl)
static boolean isAWTComponent(final Object target)
static final Constructor<?> getConstructor(final Class<?> clazz, Class<?> ... cstrArgTypes)
Returns a compatible constructor if available, otherwise throws an exception.
static final Object callMethod(final Object instance, final Method method, final Object ... args)