Mercurial > hg > de.codedo.java.editor
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 |
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 } |