1
2
3
4
5
6 package dev.metaschema.databind.model;
7
8 import java.lang.reflect.Field;
9 import java.lang.reflect.Type;
10
11 import edu.umd.cs.findbugs.annotations.NonNull;
12
13
14
15
16 @FunctionalInterface
17 public interface IFeatureJavaField extends IValuedMutable {
18
19
20
21
22
23
24 @NonNull
25 Field getField();
26
27
28
29
30
31
32
33
34
35 @SuppressWarnings("null")
36 @NonNull
37 default Type getType() {
38 return getField().getGenericType();
39 }
40
41
42
43
44
45
46
47 @NonNull
48 default Class<?> getItemType() {
49 return (Class<?>) getType();
50 }
51
52 @Override
53 default Object getValue(@NonNull Object parent) {
54 Field field = getField();
55
56
57 Object retval;
58 try {
59 Object result = field.get(parent);
60 retval = result;
61 } catch (IllegalArgumentException | IllegalAccessException ex) {
62 throw new IllegalArgumentException(
63 String.format("Unable to get the value of field '%s' in class '%s'.", field.getName(),
64 field.getDeclaringClass().getName()),
65 ex);
66
67
68 }
69 return retval;
70 }
71
72 @Override
73 default void setValue(@NonNull Object parentObject, Object value) {
74 Field field = getField();
75
76
77 try {
78 field.set(parentObject, value);
79 } catch (IllegalArgumentException | IllegalAccessException ex) {
80 throw new IllegalArgumentException(
81 String.format(
82 "Unable to set the value of field '%s' in class '%s'." +
83 " Perhaps this is a data type adapter problem on the declared class?",
84 field.getName(),
85 field.getDeclaringClass().getName()),
86 ex);
87
88
89 }
90 }
91
92 }