Skip to content

Commit de8c4e2

Browse files
committed
fix LANG-1815
1 parent e7cdeac commit de8c4e2

2 files changed

Lines changed: 48 additions & 1 deletion

File tree

src/main/java/org/apache/commons/lang3/AnnotationUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ public static boolean equals(final Annotation a1, final Annotation a2) {
212212
for (final Method m : type1.getDeclaredMethods()) {
213213
if (m.getParameterTypes().length == 0
214214
&& isValidAnnotationMemberType(m.getReturnType())) {
215+
m.setAccessible(true);
215216
final Object v1 = m.invoke(a1);
216217
final Object v2 = m.invoke(a2);
217218
if (!memberEquals(m.getReturnType(), v1, v2)) {
@@ -220,7 +221,7 @@ && isValidAnnotationMemberType(m.getReturnType())) {
220221
}
221222
}
222223
} catch (final ReflectiveOperationException ex) {
223-
return false;
224+
throw new IllegalStateException(ex);
224225
}
225226
return true;
226227
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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+
* https://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+
package org.apache.commons.lang3.external;
18+
19+
import org.apache.commons.lang3.AnnotationUtils;
20+
import org.junit.jupiter.api.Assertions;
21+
import org.junit.jupiter.api.Test;
22+
23+
import java.lang.annotation.Retention;
24+
import java.lang.annotation.RetentionPolicy;
25+
26+
// CAUTION: in order to reproduce https://issues.apache.org/jira/browse/LANG-1815,
27+
// this test MUST be located OUTSIDE org.apache.commons.lang3 package.
28+
// Do NOT move it to the org.apache.commons.lang3 package!
29+
public class AnnotationEqualsTest {
30+
@Retention(RetentionPolicy.RUNTIME)
31+
@interface Tag {
32+
String value();
33+
}
34+
35+
@Tag("value")
36+
private final Object a = new Object();
37+
@Tag("value")
38+
private final Object b = new Object();
39+
40+
@Test
41+
void equalsWorksOnPackagePrivateAnnotations() throws Exception {
42+
Tag tagA = getClass().getDeclaredField("a").getAnnotation(Tag.class);
43+
Tag tagB = getClass().getDeclaredField("b").getAnnotation(Tag.class);
44+
Assertions.assertTrue(AnnotationUtils.equals(tagA, tagB));
45+
}
46+
}

0 commit comments

Comments
 (0)