11package io .dongtai .iast .core .utils ;
22
3+ import io .dongtai .log .DongTaiLog ;
4+
5+ import java .lang .reflect .AccessibleObject ;
36import java .lang .reflect .Field ;
47import java .lang .reflect .Method ;
8+ import java .security .AccessController ;
9+ import java .security .PrivilegedAction ;
510import java .util .*;
611
712/**
@@ -11,15 +16,15 @@ public class ReflectUtils {
1116
1217 public static Field getFieldFromClass (Class <?> cls , String fieldName ) throws NoSuchFieldException {
1318 Field field = cls .getDeclaredField (fieldName );
14- field . setAccessible (true );
19+ setAccessible (field );
1520 return field ;
1621 }
1722
1823 public static Field getDeclaredFieldFromClassByName (Class <?> cls , String fieldName ) {
1924 Field [] declaredFields = cls .getDeclaredFields ();
2025 for (Field field : declaredFields ) {
2126 if (fieldName .equals (field .getName ())) {
22- field . setAccessible (true );
27+ setAccessible (field );
2328 return field ;
2429 }
2530 }
@@ -55,8 +60,18 @@ public static Method getPublicMethodFromClass(Class<?> cls, String method) throw
5560
5661 public static Method getPublicMethodFromClass (Class <?> cls , String methodName , Class <?>[] parameterTypes ) throws NoSuchMethodException {
5762 Method method = cls .getMethod (methodName , parameterTypes );
58- method .setAccessible (true );
59- return method ;
63+ return getSecurityPublicMethod (method );
64+ }
65+
66+ public static Method getSecurityPublicMethod (Method method ) throws NoSuchMethodException {
67+ if (hasNotSecurityManager ()) {
68+ setAccessible (method );
69+ return method ;
70+ }
71+ return AccessController .doPrivileged ((PrivilegedAction <Method >) () -> {
72+ setAccessible (method );
73+ return method ;
74+ });
6075 }
6176
6277 public static Method getDeclaredMethodFromClass (Class <?> cls , String methodName , Class <?>[] parameterTypes ) {
@@ -66,8 +81,11 @@ public static Method getDeclaredMethodFromClass(Class<?> cls, String methodName,
6681 }
6782 for (Method method : methods ) {
6883 if (methodName .equals (method .getName ()) && Arrays .equals (parameterTypes , method .getParameterTypes ())) {
69- method .setAccessible (true );
70- return method ;
84+ try {
85+ return getSecurityPublicMethod (method );
86+ } catch (NoSuchMethodException e ) {
87+ e .printStackTrace ();
88+ }
7189 }
7290 }
7391 return null ;
@@ -137,13 +155,47 @@ public static List<Class<?>> getAllInterfaces(Class<?> cls) {
137155 private static void getAllInterfaces (Class <?> cls , List <Class <?>> interfaceList ) {
138156 while (cls != null ) {
139157 Class <?>[] interfaces = cls .getInterfaces ();
140- for (int i = 0 ; i < interfaces . length ; i ++ ) {
141- if (!interfaceList .contains (interfaces [ i ] )) {
142- interfaceList .add (interfaces [ i ] );
143- getAllInterfaces (interfaces [ i ] , interfaceList );
158+ for (Class <?> anInterface : interfaces ) {
159+ if (!interfaceList .contains (anInterface )) {
160+ interfaceList .add (anInterface );
161+ getAllInterfaces (anInterface , interfaceList );
144162 }
145163 }
146164 cls = cls .getSuperclass ();
147165 }
148166 }
167+
168+ public static Field [] getDeclaredFieldsSecurity (Class <?> cls ) {
169+ Objects .requireNonNull (cls );
170+ if (hasNotSecurityManager ()) {
171+ return getDeclaredFields (cls );
172+ }
173+ return (Field []) AccessController .doPrivileged ((PrivilegedAction <Field []>) () -> {
174+ return getDeclaredFields (cls );
175+ });
176+ }
177+
178+ private static Field [] getDeclaredFields (Class <?> cls ) {
179+ Field [] declaredFields = cls .getDeclaredFields ();
180+ for (Field field : declaredFields ) {
181+ setAccessible (field );
182+ }
183+ return declaredFields ;
184+ }
185+
186+ private static boolean hasNotSecurityManager () {
187+ return System .getSecurityManager () == null ;
188+ }
189+
190+ private static void setAccessible (AccessibleObject accessibleObject ) {
191+ try {
192+ if (!accessibleObject .isAccessible ()) {
193+ accessibleObject .setAccessible (true );
194+ }
195+ } catch (Throwable e ){
196+ DongTaiLog .debug ("setAccessible failed: {}, {}" ,
197+ e .getMessage (), e .getCause () != null ? e .getCause ().getMessage () : "" );
198+ }
199+
200+ }
149201}
0 commit comments