/
HavingMethodSignature.java
executable file
·105 lines (80 loc) · 2.75 KB
/
HavingMethodSignature.java
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package chaschev.lang.reflect;
import com.google.common.primitives.Primitives;
import java.util.Arrays;
/**
* @author Andrey Chaschev chaschev@gmail.com
*/
public abstract class HavingMethodSignature {
protected final Class<?>[] params;
public HavingMethodSignature(Class<?>[] params) {
this.params = params;
}
public boolean matchesStrictly(Class... parameters) {
return Arrays.equals(params, parameters);
}
public boolean matches(Object... parameters) {
if (!checkLength(parameters)) return false;
for (int i = 0, length = parameters.length; i < length; i++) {
final boolean matches = _matches(parameters[i].getClass(), params[i]);
if(!matches) {
return false;
}
}
return true;
}
public boolean matchesStrictly(Object... parameters) {
if (!checkLength(parameters)) return false;
for (int i = 0, length = parameters.length; i < length; i++) {
if (params[i] != parameters[i].getClass()) {
return false;
}
}
return true;
}
public boolean matches(Class... parameters) {
if (!checkLength(parameters)) return false;
for (int i = 0, length = parameters.length; i < length; i++) {
final boolean matches = _matches(parameters[i], params[i]);
if(!matches) {
return false;
}
}
return true;
}
private static boolean _matches(Class inputParam, Class<?> declaredParam) {
boolean matches = true;
if (!declaredParam.isAssignableFrom(inputParam)) {
if(
(inputParam.isPrimitive() && Primitives.wrap(inputParam) == declaredParam) ||
(declaredParam.isPrimitive() && Primitives.wrap(declaredParam) == inputParam)
){
}else{
matches = false;
}
}
return matches;
}
private boolean checkLength(Object[] parameters) {
return params.length == parameters.length;
}
public abstract String getName();
@Override
public String toString() {
final StringBuilder sb = new StringBuilder(128)
.append(getName()).append("(");
int l = params.length;
for (int i = 0; i < l; i++) {
Class<?> param = params[i];
sb.append(param.getSimpleName());
if (i != l - 1) {
sb.append(", ");
}
}
sb.append(")");
boolean isMethod = this instanceof MethodDesc;
if (isMethod) sb.append(":");
sb.append(isMethod ? (((MethodDesc) this).method.getReturnType()
.getSimpleName()) : "");
return sb.toString();
}
}