HashCodeBuilder throws java.lang.StackOverflowError when an object contains a cycle. git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/lang/trunk@447947 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4917cb719f
commit
d032bda7e5
|
@ -16,6 +16,9 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.commons.lang.builder;
|
package org.apache.commons.lang.builder;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.builder.ToStringBuilderTest.ReflectionTestCycleA;
|
||||||
|
import org.apache.commons.lang.builder.ToStringBuilderTest.ReflectionTestCycleB;
|
||||||
|
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
import junit.framework.TestSuite;
|
import junit.framework.TestSuite;
|
||||||
|
@ -29,6 +32,28 @@ import junit.textui.TestRunner;
|
||||||
*/
|
*/
|
||||||
public class HashCodeBuilderTest extends TestCase {
|
public class HashCodeBuilderTest extends TestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reflection test fixture.
|
||||||
|
*/
|
||||||
|
static class ReflectionTestCycleA {
|
||||||
|
ReflectionTestCycleB b;
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A reflection test fixture.
|
||||||
|
*/
|
||||||
|
static class ReflectionTestCycleB {
|
||||||
|
ReflectionTestCycleA a;
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
return HashCodeBuilder.reflectionHashCode(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public HashCodeBuilderTest(String name) {
|
public HashCodeBuilderTest(String name) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
@ -467,4 +492,34 @@ public class HashCodeBuilderTest extends TestCase {
|
||||||
this.three = three;
|
this.three = three;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test Objects pointing to each other.
|
||||||
|
*/
|
||||||
|
public void testReflectionObjectCycle() {
|
||||||
|
ReflectionTestCycleA a = new ReflectionTestCycleA();
|
||||||
|
ReflectionTestCycleB b = new ReflectionTestCycleB();
|
||||||
|
a.b = b;
|
||||||
|
b.a = a;
|
||||||
|
// Causes:
|
||||||
|
// java.lang.StackOverflowError
|
||||||
|
// at java.lang.ClassLoader.getCallerClassLoader(Native Method)
|
||||||
|
// at java.lang.Class.getDeclaredFields(Class.java:992)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:373)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:349)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:155)
|
||||||
|
// at
|
||||||
|
// org.apache.commons.lang.builder.HashCodeBuilderTest$ReflectionTestCycleB.hashCode(HashCodeBuilderTest.java:53)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:422)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.reflectionAppend(HashCodeBuilder.java:383)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:349)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.reflectionHashCode(HashCodeBuilder.java:155)
|
||||||
|
// at
|
||||||
|
// org.apache.commons.lang.builder.HashCodeBuilderTest$ReflectionTestCycleA.hashCode(HashCodeBuilderTest.java:42)
|
||||||
|
// at org.apache.commons.lang.builder.HashCodeBuilder.append(HashCodeBuilder.java:422)
|
||||||
|
|
||||||
|
// a.hashCode();
|
||||||
|
// b.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue