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 } |