/
Fields.java
147 lines (129 loc) · 4.66 KB
/
Fields.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.util.reflection;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.mockito.internal.util.Checks;
/**
* Small fluent reflection tools to work with fields.
*
* Code is very new and might need rework.
*/
@Deprecated
public abstract class Fields {
/**
* Instance fields declared in the class and superclasses of the given instance.
*
* @param instance Instance from which declared fields will be retrieved.
* @return InstanceFields of this object instance.
*/
@Deprecated
public static InstanceFields allDeclaredFieldsOf(Object instance) {
List<InstanceField> instanceFields = new ArrayList<>();
for (Class<?> clazz = instance.getClass();
clazz != Object.class;
clazz = clazz.getSuperclass()) {
instanceFields.addAll(instanceFieldsIn(instance, clazz.getDeclaredFields()));
}
return new InstanceFields(instance, instanceFields);
}
/**
* Instance fields declared in the class of the given instance.
*
* @param instance Instance from which declared fields will be retrieved.
* @return InstanceFields of this object instance.
*/
@Deprecated
public static InstanceFields declaredFieldsOf(Object instance) {
List<InstanceField> instanceFields = new ArrayList<>();
instanceFields.addAll(instanceFieldsIn(instance, instance.getClass().getDeclaredFields()));
return new InstanceFields(instance, instanceFields);
}
@Deprecated
private static List<InstanceField> instanceFieldsIn(Object instance, Field[] fields) {
List<InstanceField> instanceDeclaredFields = new ArrayList<>();
for (Field field : fields) {
InstanceField instanceField = new InstanceField(field, instance);
instanceDeclaredFields.add(instanceField);
}
return instanceDeclaredFields;
}
/**
* Accept fields annotated by the given annotations.
*
* @param annotations Annotation types to check.
* @return The filter.
*/
@SuppressWarnings({"unchecked", "vararg"})
@Deprecated
public static Predicate<InstanceField> annotatedBy(
final Class<? extends Annotation>... annotations) {
return instanceField -> {
Checks.checkNotNull(annotations, "Provide at least one annotation class");
for (Class<? extends Annotation> annotation : annotations) {
if (instanceField.isAnnotatedBy(annotation)) {
return true;
}
}
return false;
};
}
/**
* Accept fields with non null value.
*
* @return The filter.
*/
@Deprecated
private static Predicate<InstanceField> nullField() {
return instanceField -> !instanceField.isNull();
}
/**
* Accept fields with non null value.
*
* @return The filter.
*/
@Deprecated
public static Predicate<InstanceField> syntheticField() {
return instanceField -> !instanceField.isSynthetic();
}
@Deprecated
public static class InstanceFields {
private final Object instance;
private final List<InstanceField> instanceFields;
public InstanceFields(Object instance, List<InstanceField> instanceFields) {
this.instance = instance;
this.instanceFields = instanceFields;
}
public InstanceFields filter(Predicate<InstanceField> withFilter) {
return new InstanceFields(
instance,
instanceFields.stream().filter(withFilter).collect(Collectors.toList()));
}
public InstanceFields notNull() {
return filter(nullField());
}
public List<InstanceField> instanceFields() {
return new ArrayList<>(instanceFields);
}
public List<Object> assignedValues() {
List<Object> values = new ArrayList<>(instanceFields.size());
for (InstanceField instanceField : instanceFields) {
values.add(instanceField.read());
}
return values;
}
public List<String> names() {
List<String> fieldNames = new ArrayList<>(instanceFields.size());
for (InstanceField instanceField : instanceFields) {
fieldNames.add(instanceField.name());
}
return fieldNames;
}
}
}