Java源码示例:openmods.reflection.FieldAccess
示例1
public ConfigurableClassAdapter(Class<? extends T> cls) {
this.cls = cls;
ImmutableMap.Builder<String, FieldAdapter<?>> fields = ImmutableMap.builder();
for (Field f : cls.getFields()) {
Configurable ann = f.getAnnotation(Configurable.class);
if (ann != null) {
String name = ann.name();
if (name.isEmpty()) name = f.getName();
final FieldAccess<?> access = FieldAccess.create(f);
final IStringSerializer<?> serializer = TypeRW.getStringSerializer(f.getType());
Preconditions.checkState(serializer != null, "Can't find serializer for field %s", f);
@SuppressWarnings({ "rawtypes", "unchecked" })
final FieldAdapter<?> adapter = new FieldAdapter(serializer, access);
fields.put(name, adapter);
}
}
this.fields = fields.build();
}
示例2
public void addFields(Object target) {
Class<?> cls = target.getClass();
while (cls != Object.class) {
for (Field field : cls.getDeclaredFields()) {
StoreOnDrop marker = field.getAnnotation(StoreOnDrop.class);
if (marker == null) continue;
Preconditions.checkArgument(ISyncableObject.class.isAssignableFrom(field.getType()),
"Field '%s' has SyncableDrop annotation, but isn't ISyncableObject", field);
final FieldAccess<ISyncableObject> wrappedField = FieldAccess.create(field);
final ISyncableObject obj = wrappedField.get(target);
Preconditions.checkNotNull(obj, "Field '%s' contains null", field);
final String suggestedName = field.getName();
final String name = Strings.isNullOrEmpty(marker.name())? suggestedName : marker.name();
addObject(name, obj);
}
cls = cls.getSuperclass();
}
}
示例3
public static void processClass(File file, final Class<?> cls) {
ConfigProcessor processor = new ConfigProcessor();
final Map<String, Field> fields = Maps.newHashMap();
for (Field f : cls.getFields()) {
Entry e = f.getAnnotation(Entry.class);
if (e == null) continue;
final Class<?> type = f.getType();
if (!(type.equals(String.class))) {
Log.warn("Field %s has @Entry annotation, but invalid type %s (should be String)", f, type);
continue;
}
if (!Modifier.isStatic(f.getModifiers())) {
Log.warn("Field %s has @Entry annotation, but isn't static", f);
continue;
}
String name = e.name();
if (name.equals(Entry.SAME_AS_FIELD)) name = f.getName();
Field prev = fields.put(name, f);
Preconditions.checkState(prev == null, "Duplicate field name: %s, fields: %s, %s", name, f, prev);
final FieldAccess<String> wrap = FieldAccess.create(f);
String defaultValue = wrap.get(null);
Preconditions.checkNotNull(defaultValue, "Field %s has no default value", f);
processor.addEntry(name, e.version(), defaultValue, (UpdateListener)value -> wrap.set(null, value), e.comment());
}
processor.process(file);
}
示例4
public FieldAdapter(IStringSerializer<T> serializer, FieldAccess<T> access) {
this.serializer = serializer;
this.access = access;
}