-
Notifications
You must be signed in to change notification settings - Fork 103
Expand file tree
/
Copy pathMethodRef.java
More file actions
87 lines (79 loc) · 1.97 KB
/
MethodRef.java
File metadata and controls
87 lines (79 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package java.beans;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import static sun.reflect.misc.ReflectUtil.isPackageAccessible;
final class MethodRef {
private String signature;
private SoftReference<Method> methodRef;
private WeakReference<Class<?>> typeRef;
void set(Method method) {
if (method == null) {
this.signature = null;
this.methodRef = null;
this.typeRef = null;
}
else {
this.signature = method.toGenericString();
this.methodRef = new SoftReference<>(method);
this.typeRef = new WeakReference<Class<?>>(method.getDeclaringClass());
}
}
boolean isSet() {
return this.methodRef != null;
}
Method get() {
if (this.methodRef == null) {
return null;
}
Method method = this.methodRef.get();
if (method == null) {
method = find(this.typeRef.get(), this.signature);
if (method == null) {
this.signature = null;
this.methodRef = null;
this.typeRef = null;
}
else {
this.methodRef = new SoftReference<>(method);
}
}
return isPackageAccessible(method.getDeclaringClass()) ? method : null;
}
private static Method find(Class<?> type, String signature) {
if (type != null) {
for (Method method : type.getMethods()) {
if (type.equals(method.getDeclaringClass())) {
if (method.toGenericString().equals(signature)) {
return method;
}
}
}
}
return null;
}
}