Skip to content

Commit b67db2b

Browse files
authored
Fix method reflection bug (#5030)
* Remove unnecessary dependencies for audit module * Remove unnecessary import * Update ApolloAuditSpanAspect.java * Update ApolloAuditSpanAspectTest.java * Update ApolloAuditSpanAspect.java * Update ApolloAuditSpanAspectTest.java
1 parent d56a92f commit b67db2b

File tree

4 files changed

+42
-14
lines changed

4 files changed

+42
-14
lines changed

apollo-audit/apollo-audit-impl/src/main/java/com/ctrip/framework/apollo/audit/aop/ApolloAuditSpanAspect.java

+18-7
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@
2424
import com.ctrip.framework.apollo.audit.constants.ApolloAuditConstants;
2525
import java.lang.annotation.Annotation;
2626
import java.lang.reflect.Method;
27-
import java.util.ArrayList;
2827
import java.util.Collection;
29-
import java.util.Collections;
28+
import java.util.Objects;
3029
import org.aspectj.lang.ProceedingJoinPoint;
30+
import org.aspectj.lang.Signature;
3131
import org.aspectj.lang.annotation.Around;
3232
import org.aspectj.lang.annotation.Aspect;
3333
import org.aspectj.lang.annotation.Pointcut;
34+
import org.aspectj.lang.reflect.MethodSignature;
35+
import org.springframework.cglib.core.ReflectUtils;
3436

3537
@Aspect
3638
public class ApolloAuditSpanAspect {
@@ -58,11 +60,15 @@ public Object around(ProceedingJoinPoint pjp, ApolloAuditLog auditLog) throws Th
5860

5961
void auditDataInfluenceArg(ProceedingJoinPoint pjp) {
6062
Method method = findMethod(pjp);
63+
if (Objects.isNull(method)) {
64+
return;
65+
}
6166
Object[] args = pjp.getArgs();
6267
for (int i = 0; i < args.length; i++) {
6368
Object arg = args[i];
6469
Annotation[] annotations = method.getParameterAnnotations()[i];
6570

71+
6672
boolean needAudit = false;
6773
String entityName = null;
6874
String fieldName = null;
@@ -87,13 +93,18 @@ void auditDataInfluenceArg(ProceedingJoinPoint pjp) {
8793

8894
Method findMethod(ProceedingJoinPoint pjp) {
8995
Class<?> clazz = pjp.getTarget().getClass();
96+
Signature pjpSignature = pjp.getSignature();
9097
String methodName = pjp.getSignature().getName();
91-
for (Method method : clazz.getDeclaredMethods()) {
92-
if (method.getName().equals(methodName)) {
93-
return method;
94-
}
98+
Class[] parameterTypes = null;
99+
if (pjpSignature instanceof MethodSignature) {
100+
parameterTypes = ((MethodSignature) pjpSignature).getParameterTypes();
101+
}
102+
try {
103+
Method method = ReflectUtils.findDeclaredMethod(clazz, methodName, parameterTypes);
104+
return method;
105+
} catch (NoSuchMethodException e) {
106+
return null;
95107
}
96-
return null;
97108
}
98109

99110
void parseArgAndAppend(String entityName, String fieldName, Object arg) {

apollo-audit/apollo-audit-impl/src/main/java/com/ctrip/framework/apollo/audit/util/ApolloAuditUtil.java

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.Collection;
2929
import java.util.Collections;
3030
import java.util.List;
31-
import java.util.Objects;
3231
import java.util.UUID;
3332
import java.util.stream.Collectors;
3433
import javax.persistence.Id;

apollo-audit/apollo-audit-impl/src/test/java/com/ctrip/framework/apollo/audit/aop/ApolloAuditSpanAspectTest.java

+24-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.ctrip.framework.apollo.audit.aop;
1818

1919
import static org.junit.jupiter.api.Assertions.assertEquals;
20+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
2021
import static org.mockito.ArgumentMatchers.any;
2122
import static org.mockito.Mockito.doNothing;
2223
import static org.mockito.Mockito.doReturn;
@@ -37,7 +38,7 @@
3738
import java.util.Arrays;
3839
import java.util.List;
3940
import org.aspectj.lang.ProceedingJoinPoint;
40-
import org.aspectj.lang.Signature;
41+
import org.aspectj.lang.reflect.MethodSignature;
4142
import org.junit.jupiter.api.Test;
4243
import org.springframework.boot.test.context.SpringBootTest;
4344
import org.springframework.boot.test.mock.mockito.MockBean;
@@ -95,20 +96,36 @@ public void testAuditDataInfluenceArg() throws NoSuchMethodException {
9596
.parseArgAndAppend(eq("App"), eq("Name"), eq(args[0]));
9697
}
9798

99+
@Test
100+
public void testAuditDataInfluenceArgCaseFindMethodReturnNull() throws NoSuchMethodException {
101+
ProceedingJoinPoint mockPJP = mock(ProceedingJoinPoint.class);
102+
Object[] args = new Object[]{new Object(), new Object()};
103+
{
104+
doReturn(null).when(aspect).findMethod(any());
105+
when(mockPJP.getArgs()).thenReturn(args);
106+
}
107+
aspect.auditDataInfluenceArg(mockPJP);
108+
verify(aspect, times(0))
109+
.parseArgAndAppend(eq("App"), eq("Name"), eq(args[0]));
110+
}
111+
98112
@Test
99113
public void testFindMethod() throws NoSuchMethodException {
100114
ProceedingJoinPoint mockPJP = mock(ProceedingJoinPoint.class);
101115
MockAuditClass mockAuditClass = new MockAuditClass();
102-
Signature signature = mock(Signature.class);
116+
MethodSignature signature = mock(MethodSignature.class);
103117
Method method = MockAuditClass.class.getMethod("mockAuditMethod", Object.class, Object.class);
118+
Method sameNameMethod = MockAuditClass.class.getMethod("mockAuditMethod", Object.class);
104119
{
105120
when(mockPJP.getTarget()).thenReturn(mockAuditClass);
106121
when(mockPJP.getSignature()).thenReturn(signature);
107122
when(signature.getName()).thenReturn("mockAuditMethod");
123+
when(signature.getParameterTypes()).thenReturn(new Class[]{Object.class, Object.class});
108124
}
109125
Method methodFounded = aspect.findMethod(mockPJP);
110126

111127
assertEquals(method, methodFounded);
128+
assertNotEquals(sameNameMethod, methodFounded);
112129
}
113130

114131
@Test
@@ -155,5 +172,10 @@ public void mockAuditMethod(
155172
@ApolloAuditLogDataInfluenceTableField(fieldName = "Name") Object val1,
156173
Object val2) {
157174
}
175+
176+
// same name method test
177+
public void mockAuditMethod(
178+
Object val2) {
179+
}
158180
}
159181
}

apollo-audit/apollo-audit-spring-boot-starter/pom.xml

-4
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,6 @@
3838
<groupId>org.springframework.boot</groupId>
3939
<artifactId>spring-boot-autoconfigure</artifactId>
4040
</dependency>
41-
<dependency>
42-
<groupId>org.aspectj</groupId>
43-
<artifactId>aspectjrt</artifactId>
44-
</dependency>
4541
</dependencies>
4642

4743
</project>

0 commit comments

Comments
 (0)