diff --git a/src/main/java/com/helger/jcodemodel/AbstractJClass.java b/src/main/java/com/helger/jcodemodel/AbstractJClass.java
index 377aa3c6..8965b9ec 100644
--- a/src/main/java/com/helger/jcodemodel/AbstractJClass.java
+++ b/src/main/java/com/helger/jcodemodel/AbstractJClass.java
@@ -42,6 +42,7 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -425,6 +426,29 @@ public final JTypeWildcard wildcard (@Nonnull final EWildcardBoundMode eMode)
protected abstract AbstractJClass substituteParams (@Nonnull JTypeVar [] aVariables,
@Nonnull List extends AbstractJClass> aBindings);
+ /**
+ * Check if this class is a class container and if so try to find the inner
+ * class with the provided name.
+ *
+ * @param sName
+ * The name to check. May be null
.
+ * @return The inner class with the provided name.
+ * @since 3.0.3
+ */
+ @Nullable
+ public AbstractJClassContainer > getInnerClass (@Nullable final String sName)
+ {
+ if (sName != null && this instanceof AbstractJClassContainer >)
+ {
+ @SuppressWarnings ("rawtypes")
+ final Collection > aInnerClasses = ((AbstractJClassContainer) this).classes ();
+ for (final AbstractJClassContainer > aInnerClass : aInnerClasses)
+ if (aInnerClass.name ().equals (sName))
+ return aInnerClass;
+ }
+ return null;
+ }
+
/**
* @return name.class
*/
diff --git a/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java b/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java
index ad1f2ac7..36f35209 100644
--- a/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java
+++ b/src/main/java/com/helger/jcodemodel/AbstractJClassContainer.java
@@ -82,8 +82,6 @@ public abstract class AbstractJClassContainer m_aClasses;
@@ -178,7 +176,8 @@ public String fullName ()
}
/**
- * @return true
if this is an anonymous class.
+ * @return true
if this is an anonymous class. Note: this applies
+ * only to classes.
*/
public final boolean isAnonymous ()
{
@@ -213,14 +212,6 @@ public final JPackage getPackage ()
return parentContainer ().getPackage ();
}
- @Nonnull
- private Map _getClasses ()
- {
- if (m_aClasses == null)
- m_aClasses = new TreeMap <> ();
- return m_aClasses;
- }
-
@Nonnull
protected abstract CLASSTYPE createInnerClass (final int nMods,
@Nonnull final EClassType eClassType,
@@ -237,12 +228,19 @@ public final CLASSTYPE _class (final int nMods,
else
sRealName = sName;
- final CLASSTYPE aExistingClass = _getClasses ().get (sRealName);
- if (aExistingClass != null)
- throw new JClassAlreadyExistsException (aExistingClass);
+ // Existing class?
+ if (m_aClasses != null)
+ {
+ final CLASSTYPE aExistingClass = m_aClasses.get (sRealName);
+ if (aExistingClass != null)
+ throw new JClassAlreadyExistsException (aExistingClass);
+ }
+ else
+ m_aClasses = new TreeMap <> ();
+ // Create and add inner class
final CLASSTYPE c = createInnerClass (nMods, eClassType, sName);
- _getClasses ().put (sRealName, c);
+ m_aClasses.put (sRealName, c);
return c;
}
diff --git a/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java b/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java
index 00c78bde..c1850e18 100644
--- a/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java
+++ b/src/test/java/com/helger/jcodemodel/InnerClassFuncTest.java
@@ -41,6 +41,8 @@
package com.helger.jcodemodel;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
import org.junit.Test;
@@ -57,6 +59,8 @@ public void innerClassesAreImported () throws Exception
final JDefinedClass daInnerInner = daInner1._class ("InnerInner");
final JDefinedClass daInner2 = aClass._class ("DaTestClassInner");
final JDefinedClass daInner2Inner = daInner2._class ("Inner2");
+ assertSame (daInner2Inner, daInner2.getInnerClass ("Inner2"));
+ assertNull (daInner2.getInnerClass ("Inner3"));
assertEquals ("Inner", daInner1.name ());
assertEquals ("org.test.DaTestClass.Inner", daInner1.fullName ());