annotate src/de/codedo/java/editor/ReflectionUtils.java @ 9:935df68696c0 default tip

Reflection Code in eigene Klasse verschoben.
author Dirk Olmes <dirk.olmes@codedo.de>
date Thu, 15 Oct 2020 12:05:06 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
1 package de.codedo.java.editor;
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
2
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
3 import java.lang.reflect.Field;
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
4
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
5 public class ReflectionUtils
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
6 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
7 public static Field getField(String fieldName, Object object) throws NoSuchFieldException
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
8 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
9 Field field = findField(fieldName, object.getClass());
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
10 field.setAccessible(true);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
11 return field;
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
12 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
13
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
14 @SuppressWarnings("unchecked")
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
15 public static <T> T getFieldValue(String fieldName, Object object) throws NoSuchFieldException, IllegalAccessException
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
16 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
17 Field field = getField(fieldName, object);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
18 return (T)field.get(object);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
19 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
20
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
21 public static void setFieldValue(Object object, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
22 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
23 Field field = getField(fieldName, object);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
24 field.set(object, value);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
25 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
26
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
27 private static Field findField(String fieldName, Class<?> clazz) throws NoSuchFieldException
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
28 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
29 try
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
30 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
31 return clazz.getDeclaredField(fieldName);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
32 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
33 catch (NoSuchFieldException ex)
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
34 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
35 // OK, this class does not declare the field. Continue searching the superclass below.
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
36 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
37
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
38 Class<?> superClass = clazz.getSuperclass();
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
39 if (superClass == null)
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
40 {
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
41 throw new IllegalStateException("Field " + fieldName + " could not be found in object's type hierarchy.");
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
42 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
43 return findField(fieldName, superClass);
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
44 }
935df68696c0 Reflection Code in eigene Klasse verschoben.
Dirk Olmes <dirk.olmes@codedo.de>
parents:
diff changeset
45 }