View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.shardingsphere.agent.plugin.core.util;
19  
20  import lombok.AccessLevel;
21  import lombok.NoArgsConstructor;
22  import lombok.SneakyThrows;
23  
24  import java.lang.reflect.Field;
25  import java.util.Optional;
26  
27  /**
28   * Agent reflection utility class.
29   */
30  @NoArgsConstructor(access = AccessLevel.PRIVATE)
31  public final class AgentReflectionUtils {
32      
33      /**
34       * Get field value.
35       *
36       * @param target target
37       * @param fieldName field name
38       * @param <T> type of field value
39       * @return field value
40       * @throws IllegalStateException illegal state exception
41       */
42      public static <T> T getFieldValue(final Object target, final String fieldName) {
43          Optional<Field> field = findField(fieldName, target.getClass());
44          if (field.isPresent()) {
45              return getFieldValue(target, field.get());
46          }
47          throw new IllegalStateException(String.format("Can not find field name `%s` in class %s.", fieldName, target.getClass()));
48      }
49      
50      @SuppressWarnings("unchecked")
51      @SneakyThrows(IllegalAccessException.class)
52      private static <T> T getFieldValue(final Object target, final Field field) {
53          boolean accessible = field.isAccessible();
54          if (!accessible) {
55              field.setAccessible(true);
56          }
57          T result = (T) field.get(target);
58          if (!accessible) {
59              field.setAccessible(false);
60          }
61          return result;
62      }
63      
64      private static Optional<Field> findField(final String fieldName, final Class<?> targetClass) {
65          Class<?> currentTargetClass = targetClass;
66          while (Object.class != currentTargetClass) {
67              try {
68                  return Optional.of(currentTargetClass.getDeclaredField(fieldName));
69              } catch (final NoSuchFieldException ignored) {
70                  currentTargetClass = currentTargetClass.getSuperclass();
71              }
72          }
73          return Optional.empty();
74      }
75  }