Mercurial Hosting > nabble
comparison src/fschmidt/util/java/ClassUtils.java @ 68:00520880ad02
add fschmidt source
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Sun, 05 Oct 2025 17:24:15 -0600 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 67:9d0fefce6985 | 68:00520880ad02 |
|---|---|
| 1 package fschmidt.util.java; | |
| 2 | |
| 3 import java.lang.reflect.Method; | |
| 4 import java.util.Arrays; | |
| 5 import java.util.HashMap; | |
| 6 import java.util.Map; | |
| 7 import java.util.WeakHashMap; | |
| 8 | |
| 9 | |
| 10 public final class ClassUtils { | |
| 11 | |
| 12 private ClassUtils() {} // never | |
| 13 | |
| 14 private static final class Key { | |
| 15 private final String name; | |
| 16 private final Class[] parameterTypes; | |
| 17 | |
| 18 private Key(Method m) { | |
| 19 this(m.getName(),m.getParameterTypes()); | |
| 20 } | |
| 21 | |
| 22 private Key(String name,Class[] parameterTypes) { | |
| 23 this.name = name; | |
| 24 this.parameterTypes = parameterTypes; | |
| 25 } | |
| 26 | |
| 27 public boolean equals(Object obj) { | |
| 28 if( !(obj instanceof Key) ) | |
| 29 return false; | |
| 30 Key key = (Key)obj; | |
| 31 return key.name.equals(name) && Arrays.equals(key.parameterTypes,parameterTypes); | |
| 32 } | |
| 33 | |
| 34 public int hashCode() { | |
| 35 return name.hashCode()+31*Arrays.hashCode(parameterTypes); | |
| 36 } | |
| 37 } | |
| 38 | |
| 39 private static final Map<Class,FutureValue<Map<Key,Method>>> cache = new WeakHashMap<Class,FutureValue<Map<Key,Method>>>(); | |
| 40 | |
| 41 // return null if not found | |
| 42 public static Method getMethod(final Class cls,String name,Class... parameterTypes) { | |
| 43 FutureValue<Map<Key,Method>> ft; | |
| 44 synchronized(cache) { | |
| 45 ft = cache.get(cls); | |
| 46 if( ft==null ) { | |
| 47 ft = new FutureValue<Map<Key,Method>>() { | |
| 48 protected Map<Key,Method> compute() { | |
| 49 Map<Key,Method> map = new HashMap<Key,Method>(); | |
| 50 for( Method m : cls.getMethods() ) { | |
| 51 Method m2 = map.put(new Key(m),m); | |
| 52 if( m2 != null ) | |
| 53 throw new RuntimeException("duplicate methods "+m+" and "+m2); | |
| 54 } | |
| 55 return map; | |
| 56 } | |
| 57 }; | |
| 58 cache.put(cls,ft); | |
| 59 } | |
| 60 } | |
| 61 Key key = new Key(name,parameterTypes); | |
| 62 return ft.get().get(key); | |
| 63 } | |
| 64 | |
| 65 } |
