JUNEAU-169 Dynamic annotations.
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
index 9cbe297..1f45b27 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanMapTest.java
@@ -1858,6 +1858,60 @@
 		}

 	}

 

+	@Test

+	public void testHiddenProperties_usingConfig() throws Exception {

+		JsonSerializer s = SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(Uc.class).build();

+		BeanMeta bm = s.getBeanMeta(U.class);

+		assertNotNull(bm.getPropertyMeta("a"));

+		assertNotNull(bm.getPropertyMeta("b"));

+		assertNull(bm.getPropertyMeta("c"));

+		assertNull(bm.getPropertyMeta("d"));

+

+		Uc t = new Uc();

+		t.a = "a";

+		t.b = "b";

+		String r = s.serialize(t);

+		assertEquals("{a:'a',b:'b'}", r);

+

+		// Make sure setters are used if present.

+		t = JsonParser.DEFAULT.builder().applyAnnotations(Uc.class).build().parse(r, Uc.class);

+		assertEquals("b(setter)", t.b);

+	}

+

+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="Uc.getB,Uc.c,Uc.getD,Uc.setD"))

+	public static class Uc {

+		public String a, b;

+

+		public String getA() {

+			return a;

+		}

+

+		public void setA(String a) {

+			this.a = a;

+		}

+

+		@BeanIgnore

+		public String getB() {

+			return b;

+		}

+

+		public void setB(String b) {

+			this.b = b+"(setter)";

+		}

+

+		@BeanIgnore

+		public String c;

+

+		@BeanIgnore

+		public String getD() {

+			return null;

+		}

+

+		@BeanIgnore

+		public void setD(String d) {

+		}

+	}

+

 	//====================================================================================================

 	// testBeanPropertyOrder

 	//====================================================================================================

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/annotation/BeanIgnoreTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/annotation/BeanIgnoreTest.java
index 97ae0f1..1893314 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/annotation/BeanIgnoreTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/annotation/BeanIgnoreTest.java
@@ -14,10 +14,15 @@
 

 import static org.apache.juneau.testutils.TestUtils.*;

 

+import org.apache.juneau.json.*;

 import org.junit.*;

 

 public class BeanIgnoreTest {

 

+	//------------------------------------------------------------------------------------------------------------------

+	// Test @BeanIgnore on properties

+	//------------------------------------------------------------------------------------------------------------------

+

 	public static class A {

 		public String getA() {

 			return "a";

@@ -34,15 +39,39 @@
 	}

 

 	@Test

-	public void test() throws Exception {

+	public void testBeanIgnoreOnProperties() throws Exception {

 		assertObjectEquals("{c:'c',a:'a'}", new A());

 	}

 

-	@Test

-	public void testBeanIgnoreOnBean() throws Exception {

-		assertObjectEquals("{f2:2,f3:'xxx',f4:'xxx'}", new B());

+	@BeanConfig(

+		annotateBeanIgnore={

+			@BeanIgnore(on="Ac.getB"),

+			@BeanIgnore(on="Ac.d")

+		}

+	)

+	public static class Ac {

+		public String getA() {

+			return "a";

+		}

+

+		public String getB() {

+			return "b";

+		}

+

+		public String c = "c";

+

+		public String d = "d";

 	}

 

+	@Test

+	public void testBeanIgnoreOnProperties_usingConfig() throws Exception {

+		assertObjectEquals("{c:'c',a:'a'}", new Ac(), SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(Ac.class).build());

+	}

+

+	//------------------------------------------------------------------------------------------------------------------

+	// Test @BeanIgnore on classes

+	//------------------------------------------------------------------------------------------------------------------

+

 	@BeanIgnore

 	public static class B1 {

 		public int f = 1;

@@ -61,5 +90,34 @@
 			return new B1();

 		}

 	}

+

+	@Test

+	public void testBeanIgnoreOnBean() throws Exception {

+		assertObjectEquals("{f2:2,f3:'xxx',f4:'xxx'}", new B());

+	}

+

+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="B1c"))

+	public static class B1c {

+		public int f = 1;

+

+		@Override

+		public String toString() {

+			return "xxx";

+		}

+	}

+

+	public static class Bc {

+		public int f2 = 2;

+		public B1c f3 = new B1c();

+

+		public B1c getF4() {

+			return new B1c();

+		}

+	}

+

+	@Test

+	public void testBeanIgnoreOnBean_usingConfig() throws Exception {

+		assertObjectEquals("{f2:2,f3:'xxx',f4:'xxx'}", new Bc(), SimpleJsonSerializer.DEFAULT.builder().applyAnnotations(B1c.class).build());

+	}

 }

 

diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoListSwapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoListSwapTest.java
index 3655367..a5c51d7 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoListSwapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoListSwapTest.java
@@ -34,7 +34,15 @@
 	private static final ObjectList OBJECTLIST = new ObjectList().append("foo");
 
 	private static PojoSwap find(Class<?> c) {
-		return AutoListSwap.find(ClassInfo.of(c));
+		return AutoListSwap.find(BeanContext.DEFAULT, ClassInfo.of(c));
+	}
+
+	private static PojoSwap find(BeanContext bc, Class<?> c) {
+		return AutoListSwap.find(bc, ClassInfo.of(c));
+	}
+
+	private static BeanContext bc(Class<?> applyAnnotations) {
+		return BeanContext.DEFAULT.builder().applyAnnotations(applyAnnotations).build();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -186,6 +194,30 @@
 		assertNull(find(D02.D02A.class));
 	}
 
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="D01c"))
+	public static class D01c {
+		public List<String> toList() {
+			return STRINGLIST;
+		}
+	}
+	public static class D02c {
+		public class D02Ac {
+			public List<String> toList() {
+				return STRINGLIST;
+			}
+		}
+	}
+
+	@Test
+	public void d03_ignoreClass_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(D01c.class), D01c.class));
+	}
+
+	@Test
+	public void d04_ignoreClass_memberClass_usingConfig() throws Exception {
+		assertNull(find(bc(D01c.class), D02c.D02Ac.class));
+	}
+
 	//------------------------------------------------------------------------------------------------------------------
 	// Ignore swap method
 	//------------------------------------------------------------------------------------------------------------------
@@ -196,6 +228,12 @@
 			return STRINGLIST;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="E01c.toList"))
+	public static class E01c {
+		public List<String> toList() {
+			return STRINGLIST;
+		}
+	}
 	public static class E02 {
 		@Deprecated
 		public List<String> toList() {
@@ -224,6 +262,11 @@
 	}
 
 	@Test
+	public void e01c_ignoreSwapMethod_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(BeanContext.DEFAULT.builder().applyAnnotations(E01c.class).build(), E01c.class));
+	}
+
+	@Test
 	public void e02_ignoreSwapMethod_deprecated() throws Exception {
 		assertNull(find(E02.class));
 	}
@@ -256,6 +299,15 @@
 			return null;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="F01c.create"))
+	public static class F01c {
+		public List<String> toList() {
+			return STRINGLIST;
+		}
+		public static F01c create(List<String> o) {
+			return null;
+		}
+	}
 	public static class F02 {
 		public List<String> toList() {
 			return STRINGLIST;
@@ -304,6 +356,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void f01c_ignoreUnswapMethod_beanIgnore_applyConfig() throws Exception {
+		find(bc(F01c.class), F01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void f02_ignoreUnswapMethod_deprecated() throws Exception {
 		find(F02.class).unswap(null, null, null);
 	}
@@ -340,6 +397,14 @@
 		}
 	}
 
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="G01c(List)"))
+	public static class G01c {
+		public G01c(List<String> o) {}
+		public List<String> toList() {
+			return STRINGLIST;
+		}
+	}
+
 	public static class G02 {
 		@Deprecated
 		public G02(List<String> o) {}
@@ -354,6 +419,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void g01c_ignoreUnswapConstructor_beanIgnore_usingConfig() throws Exception {
+		find(bc(G01c.class), G01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void g02_ignoreUnswapConstructor_deprecated() throws Exception {
 		find(G02.class).unswap(null, null, null);
 	}
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoMapSwapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoMapSwapTest.java
index c32fa0f..2761e11 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoMapSwapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoMapSwapTest.java
@@ -34,7 +34,15 @@
 	private static final ObjectMap OBJECTMAP = new ObjectMap().append("foo","bar");
 
 	private static PojoSwap find(Class<?> c) {
-		return AutoMapSwap.find(ClassInfo.of(c));
+		return AutoMapSwap.find(BeanContext.DEFAULT, ClassInfo.of(c));
+	}
+
+	private static PojoSwap find(BeanContext bc, Class<?> c) {
+		return AutoMapSwap.find(bc, ClassInfo.of(c));
+	}
+
+	private static BeanContext bc(Class<?> applyAnnotations) {
+		return BeanContext.DEFAULT.builder().applyAnnotations(applyAnnotations).build();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -168,6 +176,12 @@
 			return STRINGMAP;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="D01c"))
+	public static class D01c {
+		public Map<String,String> toMap() {
+			return STRINGMAP;
+		}
+	}
 	public static class D02 {
 		public class D02A {
 			public Map<String,String> toMap() {
@@ -182,6 +196,11 @@
 	}
 
 	@Test
+	public void d01c_ignoreClass_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(D01c.class), D01c.class));
+	}
+
+	@Test
 	public void d02_ignoreClass_memberClass() throws Exception {
 		assertNull(find(D02.D02A.class));
 	}
@@ -196,6 +215,12 @@
 			return STRINGMAP;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="E01c.toMap"))
+	public static class E01c {
+		public Map<String,String> toMap() {
+			return STRINGMAP;
+		}
+	}
 	public static class E02 {
 		@Deprecated
 		public Map<String,String> toMap() {
@@ -224,6 +249,11 @@
 	}
 
 	@Test
+	public void e01c_ignoreSwapMethod_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(E01c.class), E01c.class));
+	}
+
+	@Test
 	public void e02_ignoreSwapMethod_deprecated() throws Exception {
 		assertNull(find(E02.class));
 	}
@@ -256,6 +286,15 @@
 			return null;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="F01c.create(Map)"))
+	public static class F01c {
+		public Map<String,String> toMap() {
+			return STRINGMAP;
+		}
+		public static F01c create(Map<String,String> o) {
+			return null;
+		}
+	}
 	public static class F02 {
 		public Map<String,String> toMap() {
 			return STRINGMAP;
@@ -304,6 +343,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void f01c_ignoreUnswapMethod_beanIgnore_usingConfig() throws Exception {
+		find(bc(F01c.class), F01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void f02_ignoreUnswapMethod_deprecated() throws Exception {
 		find(F02.class).unswap(null, null, null);
 	}
@@ -340,6 +384,14 @@
 		}
 	}
 
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="G01c(Map)"))
+	public static class G01c {
+		public G01c(Map<String,String> o) {}
+		public Map<String,String> toMap() {
+			return STRINGMAP;
+		}
+	}
+
 	public static class G02 {
 		@Deprecated
 		public G02(Map<String,String> o) {}
@@ -354,6 +406,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void g01c_ignoreUnswapConstructor_beanIgnore_usingConfig() throws Exception {
+		find(bc(G01c.class), G01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void g02_ignoreUnswapConstructor_deprecated() throws Exception {
 		find(G02.class).unswap(null, null, null);
 	}
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoNumberSwapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoNumberSwapTest.java
index 4415e78..099a644 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoNumberSwapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoNumberSwapTest.java
@@ -17,6 +17,7 @@
 
 import java.util.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.reflect.*;
@@ -29,7 +30,15 @@
 public class AutoNumberSwapTest {
 
 	private static PojoSwap find(Class<?> c) {
-		return AutoNumberSwap.find(ClassInfo.of(c));
+		return AutoNumberSwap.find(BeanContext.DEFAULT, ClassInfo.of(c));
+	}
+
+	private static PojoSwap find(BeanContext bc, Class<?> c) {
+		return AutoNumberSwap.find(bc, ClassInfo.of(c));
+	}
+
+	private static BeanContext bc(Class<?> applyAnnotations) {
+		return BeanContext.DEFAULT.builder().applyAnnotations(applyAnnotations).build();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -593,6 +602,12 @@
 			return 1;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="D01c"))
+	public static class D01c {
+		public Integer toInteger() {
+			return 1;
+		}
+	}
 	public static class D02 {
 		public class D02A {
 			public Integer toInteger() {
@@ -607,6 +622,11 @@
 	}
 
 	@Test
+	public void d01c_ignoreClass_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(D01c.class), D01c.class));
+	}
+
+	@Test
 	public void d02_ignoreClass_memberClass() throws Exception {
 		assertNull(find(D02.D02A.class));
 	}
@@ -633,6 +653,12 @@
 			return 1;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="E01c.toInteger"))
+	public static class E01c {
+		public Integer toInteger() {
+			return 1;
+		}
+	}
 	public static class E02 {
 		@Deprecated
 		public Integer toInteger() {
@@ -661,6 +687,11 @@
 	}
 
 	@Test
+	public void e01c_ignoreSwapMethod_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(E01c.class), E01c.class));
+	}
+
+	@Test
 	public void e02_ignoreSwapMethod_deprecated() throws Exception {
 		assertNull(find(E02.class));
 	}
@@ -693,6 +724,15 @@
 			return null;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="F01c.create(java.lang.Integer)"))
+	public static class F01c {
+		public Integer toInteger() {
+			return 1;
+		}
+		public static F01 create(Integer o) {
+			return null;
+		}
+	}
 	public static class F02 {
 		public Integer toInteger() {
 			return 1;
@@ -741,6 +781,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void f01c_ignoreUnswapMethod_beanIgnore_usingConfig() throws Exception {
+		find(bc(F01c.class), F01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void f02_ignoreUnswapMethod_deprecated() throws Exception {
 		find(F02.class).unswap(null, null, null);
 	}
@@ -777,6 +822,14 @@
 		}
 	}
 
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="G01c(java.lang.Integer)"))
+	public static class G01c {
+		public G01c(Integer o) {}
+		public Integer toInteger() {
+			return 1;
+		}
+	}
+
 	public static class G02 {
 		@Deprecated
 		public G02(Integer o) {}
@@ -791,6 +844,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void g01c_ignoreUnswapConstructor_beanIgnore_usingConfig() throws Exception {
+		find(bc(G01c.class), G01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void g02_ignoreUnswapConstructor_deprecated() throws Exception {
 		find(G02.class).unswap(null, null, null);
 	}
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoObjectSwapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoObjectSwapTest.java
index a0eda02..6fa75d9 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoObjectSwapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/transform/AutoObjectSwapTest.java
@@ -35,7 +35,15 @@
 	private static final ObjectMap OBJECTMAP = new ObjectMap().append("foo","bar");
 
 	private static PojoSwap find(Class<?> c) {
-		return AutoObjectSwap.find(ClassInfo.of(c));
+		return AutoObjectSwap.find(BeanContext.DEFAULT, ClassInfo.of(c));
+	}
+
+	private static PojoSwap find(BeanContext bc, Class<?> c) {
+		return AutoObjectSwap.find(bc, ClassInfo.of(c));
+	}
+
+	private static BeanContext bc(Class<?> applyAnnotations) {
+		return BeanContext.DEFAULT.builder().applyAnnotations(applyAnnotations).build();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
@@ -171,6 +179,12 @@
 			return STRINGMAP;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="D01c"))
+	public static class D01c {
+		public Map<String,String> swap() {
+			return STRINGMAP;
+		}
+	}
 	public static class D02 {
 		public class D02A {
 			public Map<String,String> swap() {
@@ -185,6 +199,11 @@
 	}
 
 	@Test
+	public void d01c_ignoreClass_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(D01c.class), D01c.class));
+	}
+
+	@Test
 	public void d02_ignoreClass_memberClass() throws Exception {
 		assertNull(find(D02.D02A.class));
 	}
@@ -199,6 +218,12 @@
 			return STRINGMAP;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="E01c.swap"))
+	public static class E01c {
+		public Map<String,String> swap() {
+			return STRINGMAP;
+		}
+	}
 	public static class E02 {
 		@Deprecated
 		public Map<String,String> swap() {
@@ -222,6 +247,11 @@
 	}
 
 	@Test
+	public void e01c_ignoreSwapMethod_beanIgnore_usingConfig() throws Exception {
+		assertNull(find(bc(E01c.class), E01c.class));
+	}
+
+	@Test
 	public void e02_ignoreSwapMethod_deprecated() throws Exception {
 		assertNull(find(E02.class));
 	}
@@ -249,6 +279,15 @@
 			return null;
 		}
 	}
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="F01c.create(java.util.Map)"))
+	public static class F01c {
+		public Map<String,String> swap() {
+			return STRINGMAP;
+		}
+		public static F01 create(Map<String,String> o) {
+			return null;
+		}
+	}
 	public static class F02 {
 		public Map<String,String> swap() {
 			return STRINGMAP;
@@ -297,6 +336,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void f01c_ignoreUnswapMethod_beanIgnore_usingConfig() throws Exception {
+		find(bc(F01c.class), F01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void f02_ignoreUnswapMethod_deprecated() throws Exception {
 		find(F02.class).unswap(null, null, null);
 	}
@@ -333,6 +377,14 @@
 		}
 	}
 
+	@BeanConfig(annotateBeanIgnore=@BeanIgnore(on="G01c(Map)"))
+	public static class G01c {
+		public G01c(Map<String,String> o) {}
+		public Map<String,String> swap() {
+			return STRINGMAP;
+		}
+	}
+
 	public static class G02 {
 		@Deprecated
 		public G02(Map<String,String> o) {}
@@ -347,6 +399,11 @@
 	}
 
 	@Test(expected = ParseException.class)
+	public void g01c_ignoreUnswapConstructor_beanIgnore_usingConfig() throws Exception {
+		find(bc(G01c.class), G01c.class).unswap(null, null, null);
+	}
+
+	@Test(expected = ParseException.class)
 	public void g02_ignoreUnswapConstructor_deprecated() throws Exception {
 		find(G02.class).unswap(null, null, null);
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index 71cf6a1..3758c7a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -205,7 +205,7 @@
 				if (! (cVis.isVisible(c.getModifiers()) || c.isAnonymousClass()))

 					return "Class is not public";

 

-				if (c.isAnnotationPresent(BeanIgnore.class))

+				if (ctx.hasAnnotation(BeanIgnore.class, c))

 					return "Class is annotated with @BeanIgnore";

 

 				// Make sure it's serializable.

@@ -383,7 +383,7 @@
 					BeanPropertyMeta.Builder p = i.next();

 					try {

 						if (p.field == null)

-							p.setInnerField(findInnerBeanField(c, stopClass, p.name));

+							p.setInnerField(findInnerBeanField(ctx, c, stopClass, p.name));

 

 						if (p.validate(ctx, beanRegistry, typeVarImpls, bpro, bpwo)) {

 

@@ -752,7 +752,7 @@
 			for (FieldInfo f : c2.getDeclaredFields()) {

 				if (f.isAny(STATIC, TRANSIENT))

 					continue;

-				if (f.hasAnnotation(BeanIgnore.class))

+				if (ctx.hasAnnotation(BeanIgnore.class, f))

 					continue;

 

 				@SuppressWarnings("deprecation")

@@ -773,12 +773,12 @@
 		return l;

 	}

 

-	static final Field findInnerBeanField(Class<?> c, Class<?> stopClass, String name) {

+	static final Field findInnerBeanField(BeanContext bc, Class<?> c, Class<?> stopClass, String name) {

 		for (ClassInfo c2 : findClasses(c, stopClass)) {

 			for (FieldInfo f : c2.getDeclaredFields()) {

 				if (f.isAny(STATIC, TRANSIENT))

 					continue;

-				if (f.hasAnnotation(BeanIgnore.class))

+				if (f.hasAnnotation(BeanIgnore.class, bc))

 					continue;

 				if (f.hasName(name))

 					return f.inner();

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index c0cd6f4..9a3a7bf 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -458,13 +458,13 @@
 			}

 

 			for (FieldInfo f : ci.getAllFieldsParentFirst()) {

-				if (f.hasAnnotation(ParentProperty.class)) {

+				if (bc.hasAnnotation(ParentProperty.class, f)) {

 					if (f.isStatic())

 						throw new ClassMetaRuntimeException(c, "@ParentProperty used on invalid field ''{0}''.  Must be static.", f);

 					f.setAccessible();

 					parentPropertyMethod = new Setter.FieldSetter(f.inner());

 				}

-				if (f.hasAnnotation(NameProperty.class)) {

+				if (bc.hasAnnotation(NameProperty.class, f)) {

 					if (f.isStatic())

 						throw new ClassMetaRuntimeException(c, "@NameProperty used on invalid field ''{0}''.  Must be static.", f);

 					f.setAccessible();

@@ -473,7 +473,7 @@
 			}

 

 			for (FieldInfo f : ci.getDeclaredFields()) {

-				if (f.hasAnnotation(Example.class)) {

+				if (bc.hasAnnotation(Example.class, f)) {

 					if (! (f.isStatic() && ci.isParentOf(f.getType().inner())))

 						throw new ClassMetaRuntimeException(c, "@Example used on invalid field ''{0}''.  Must be static and an instance of the type.", f);

 					f.setAccessible();

@@ -483,13 +483,13 @@
 

 			// Find @NameProperty and @ParentProperty methods if present.

 			for (MethodInfo m : ci.getAllMethodsParentFirst()) {

-				if (m.hasAnnotation(ParentProperty.class)) {

+				if (bc.hasAnnotation(ParentProperty.class, m)) {

 					if (m.isStatic() || ! m.hasNumParams(1))

 						throw new ClassMetaRuntimeException(c, "@ParentProperty used on invalid method ''{0}''.  Must not be static and have one argument.", m);

 					m.setAccessible();

 					parentPropertyMethod = new Setter.MethodSetter(m.inner());

 				}

-				if (m.hasAnnotation(NameProperty.class)) {

+				if (bc.hasAnnotation(NameProperty.class, m)) {

 					if (m.isStatic() || ! m.hasNumParams(1))

 						throw new ClassMetaRuntimeException(c, "@NameProperty used on invalid method ''{0}''.  Must not be static and have one argument.", m);

 					m.setAccessible();

@@ -498,7 +498,7 @@
 			}

 

 			for (MethodInfo m : ci.getDeclaredMethods()) {

-				if (m.hasAnnotation(Example.class)) {

+				if (bc.hasAnnotation(Example.class, m)) {

 					if (! (m.isStatic() && m.hasFuzzyParamTypes(BeanSession.class) && ci.isParentOf(m.getReturnType().inner())))

 						throw new ClassMetaRuntimeException(c, "@Example used on invalid method ''{0}''.  Must be static and return an instance of the declaring class.", m);

 					m.setAccessible();

@@ -541,7 +541,7 @@
 				this.pojoSwaps.addAll(Arrays.asList(pojoSwaps));

 

 			if (bc != null)

-				this.builderSwap = BuilderSwap.findSwapFromPojoClass(c, bc.getBeanConstructorVisibility(), bc.getBeanMethodVisibility());

+				this.builderSwap = BuilderSwap.findSwapFromPojoClass(bc, c, bc.getBeanConstructorVisibility(), bc.getBeanMethodVisibility());

 

 			findPojoSwaps(this.pojoSwaps, bc);

 

@@ -701,13 +701,13 @@
 

 			PojoSwap defaultSwap = DefaultSwaps.find(ci);

 			if (defaultSwap == null)

-				defaultSwap = AutoObjectSwap.find(ci);

+				defaultSwap = AutoObjectSwap.find(bc, ci);

 			if (defaultSwap == null)

-				defaultSwap = AutoNumberSwap.find(ci);

+				defaultSwap = AutoNumberSwap.find(bc, ci);

 			if (defaultSwap == null)

-				defaultSwap = AutoMapSwap.find(ci);

+				defaultSwap = AutoMapSwap.find(bc, ci);

 			if (defaultSwap == null)

-				defaultSwap = AutoListSwap.find(ci);

+				defaultSwap = AutoListSwap.find(bc, ci);

 			if (defaultSwap != null)

 				l.add(defaultSwap);

 		}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java
index 436291b..ac8f525 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Bean.java
@@ -227,6 +227,51 @@
 	Class<?> interfaceClass() default Object.class;

 

 	/**

+	 * Dynamically apply this annotation to the specified classes.

+	 *

+	 * <p>

+	 * Used in conjunction with the {@link BeanConfig#annotateBean()}.

+	 * It is ignored when the annotation is applied directly to classes.

+	 *

+	 * <p>

+	 * The following example shows the equivalent methods for applying the {@link Bean @Bean} annotation to REST methods:

+	 * <p class='bpcode w800'>

+	 * 	<jc>// Class with explicit annotation.</jc>

+	 * 	<ja>@Bean</ja>(bpi=<jk>"street,city,state"</js>)

+	 * 	<jk>public class</jk> A {...}

+	 *

+	 * 	<jc>// Class with annotation applied via @BeanConfig</jc>

+	 * 	<jk>public class</jk> B {...}

+	 *

+	 * 	<jc>// Java REST method with @BeanConfig annotation.</jc>

+	 * 	<ja>@RestMethod</ja>(...)

+	 * 	<ja>@BeanConfig</ja>(

+	 * 		annotateBean={

+	 * 			<ja>@Bean</ja>(on=<js>"B"</js>, bpi=<jk>"street,city,state"</js>)

+	 * 		}

+	 * 	)

+	 * 	<jk>public void</jk> doFoo() {...}

+	 * </p>

+	 *

+	 * The valid pattern matches are:

+	 * <ul>

+	 * 	<li>Classes:

+	 * 		<ul>

+	 * 			<li>Fully qualified: <js>"com.foo.MyClass"</js>

+	 * 			<li>Fully qualified inner class: <js>"com.foo.MyClass$Inner1$Inner2"</js>

+	 * 			<li>Simple: <js>"MyClass"</js>

+	 * 			<li>Simple inner: <js>"MyClass$Inner1$Inner2"</js> or <js>"Inner1$Inner2"</js> or <js>"Inner2"</js>

+	 * 		</ul>

+	 * 	<li>A comma-delimited list of anything on this list.

+	 * </ul>

+	 *

+	 * <ul class='seealso'>

+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}

+	 * </ul>

+	 */

+	String on() default "";

+

+	/**

 	 * The set and order of names of properties associated with a bean class.

 	 *

 	 * @deprecated Use {@link #bpi()}

@@ -265,48 +310,6 @@
 	Class<? extends PropertyNamer> propertyNamer() default PropertyNamerDefault.class;

 

 	/**

-	 * Defines which classes/methods this annotation applies to.

-	 *

-	 * <p>

-	 * Used in conjunction with the {@link BeanConfig#annotateBean()}.

-	 * It is ignored when the annotation is applied directly to classes and methods.

-	 *

-	 * <p>

-	 * The following example shows the equivalent methods for applying the {@link Bean @Bean} annotation:

-	 * <p class='bpcode w800'>

-	 * 	<jc>// Class with explicit annotation.</jc>

-	 * 	<ja>@Bean</ja>(bpi=<jk>"street,city,state"</js>)

-	 * 	<jk>public class</jk> A {...}

-	 *

-	 * 	<jc>// Class with annotation applied via @BeanConfig</jc>

-	 * 	<jk>public class</jk> B {...}

-	 *

-	 * 	<jc>// Java REST method with @BeanConfig annotation.</jc>

-	 * 	<ja>@RestMethod</ja>(...)

-	 * 	<ja>@BeanConfig</ja>(

-	 * 		annotateBean={

-	 * 			<ja>@Bean</ja>(on=<js>"B"</js>, bpi=<jk>"street,city,state"</js>)

-	 * 		}

-	 * 	)

-	 * 	<jk>public void</jk> doFoo() {...}

-	 * </p>

-	 *

-	 * The format can be any of the following:

-	 * <ul>

-	 * 	<li>Full class name (e.g. <js>"com.foo.MyClass"</js>).

-	 * 	<li>Simple class name (e.g. <js>"MyClass"</js>).

-	 * 	<li>Full method name (e.g. <js>"com.foo.MyClass.myMethod"</js>).

-	 * 	<li>Simple method name (e.g. <js>"MyClass.myMethod"</js>).

-	 * 	<li>A comma-delimited list of anything on this list.

-	 * </ul>

-	 *

-	 * <ul class='seealso'>

-	 * 	<li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}

-	 * </ul>

-	 */

-	String on() default "";

-

-	/**

 	 * Sort bean properties in alphabetical order.

 	 *

 	 * <p>

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
index edc06f9..3a59ac8 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfig.java
@@ -50,45 +50,136 @@
 	//-----------------------------------------------------------------------------------------------------------------
 
 	/**
-	 * Indirectly applies {@link Bean @Bean} annotations to classes/methods.
+	 * Dynamically applies {@link Bean @Bean} annotations to specified classes.
 	 *
 	 * <p>
-	 * Provides an alternate approach for applying annotations to classes/methods annotations using the {@link Bean#on() @Bean.on}
-	 * annotation to specify the class/method names to apply the annotation to.
+	 * Provides an alternate approach for applying annotations using {@link Bean#on() @Bean.on} to specify the names
+	 * to apply the annotation to.
 	 *
 	 * <ul class='seealso'>
-	 * 	<li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
 	 * </ul>
 	 */
 	Bean[] annotateBean() default {};
 
 	/**
-	 * Indirectly applies {@link Beanc @Beanc} annotations to constructors.
+	 * Dynamically applies {@link Beanc @Beanc} annotations to specified constructors.
 	 *
 	 * <p>
-	 * Provides an alternate approach for applying annotations to constructor annotations using the {@link Beanc#on() @Beanc.on}
-	 * annotation to specify the constructor names to apply the annotation to.
+	 * Provides an alternate approach for applying annotations using {@link Beanc#on() @Beanc.on} to specify the names
+	 * to apply the annotation to.
 	 *
 	 * <ul class='seealso'>
-	 * 	<li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
 	 * </ul>
 	 */
 	Beanc[] annotateBeanc() default {};
 
 	/**
-	 * Indirectly applies {@link Beanp @Beanp} annotations to classes/methods.
+	 * Dynamically applies {@link Beanp @Beanp} annotations to specified methods.
 	 *
 	 * <p>
-	 * Provides an alternate approach for applying annotations to classes/methods annotations using the {@link Beanp#on() @Beanp.on}
-	 * annotation to specify the class/method names to apply the annotation to.
+	 * Provides an alternate approach for applying annotations using {@link Beanp#on() @Beanp.on} to specify the names
+	 * to apply the annotation to.
 	 *
 	 * <ul class='seealso'>
-	 * 	<li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
 	 * </ul>
 	 */
 	Beanp[] annotateBeanp() default {};
 
 	/**
+	 * Dynamically applies {@link BeanIgnore @BeanIgnore} annotations to specified classes/methods/fields/constructors.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link BeanIgnore#on() @BeanIgnore.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	BeanIgnore[] annotateBeanIgnore() default {};
+
+	/**
+	 * Dynamically applies {@link Example @Example} annotations to specified classes/methods/fields.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link Example#on() @Example.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	Example[] annotateExample() default {};
+
+	/**
+	 * Dynamically applies {@link Name @Name} annotations to specified methods/fields.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link Name#on() @Name.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	Name[] annotateName() default {};
+
+	/**
+	 * Dynamically applies {@link NameProperty @NameProperty} annotations to specified methods/fields.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link NameProperty#on() @NameProperty.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	NameProperty[] annotateNameProperty() default {};
+
+	/**
+	 * Dynamically applies {@link ParentProperty @ParentProperty} annotations to specified methods/fields.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link ParentProperty#on() @ParentProperty.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	ParentProperty[] annotateParentProperty() default {};
+
+	/**
+	 * Dynamically applies {@link Swap @Swap} annotations to specified classes/methods/fields.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link Swap#on() @Swap.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	Swap[] annotateSwap() default {};
+
+	/**
+	 * Dynamically applies {@link URI @URI} annotations to specified classes/methods/fields.
+	 *
+	 * <p>
+	 * Provides an alternate approach for applying annotations using {@link URI#on() @URI.on} to specify the names
+	 * to apply the annotation to.
+	 *
+	 * <ul class='seealso'>
+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}
+	 * </ul>
+	 */
+	URI[] annotateURI() default {};
+
+	/**
 	 * Configuration property:  Minimum bean class visibility.
 	 *
 	 * <p>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigApply.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigApply.java
index 06be70e..c78993c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigApply.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigApply.java
@@ -172,6 +172,20 @@
 			psb.addTo(BEAN_annotations, a.annotateBeanp());
 		if (a.annotateBeanc().length > 0)
 			psb.addTo(BEAN_annotations, a.annotateBeanc());
+		if (a.annotateBeanIgnore().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateBeanIgnore());
+		if (a.annotateExample().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateExample());
+		if (a.annotateName().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateName());
+		if (a.annotateNameProperty().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateNameProperty());
+		if (a.annotateParentProperty().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateParentProperty());
+		if (a.annotateURI().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateURI());
+		if (a.annotateSwap().length > 0)
+			psb.addTo(BEAN_annotations, a.annotateSwap());
 	}
 
 	private Locale locale(String in) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanIgnore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanIgnore.java
index f9caeb4..b01afbd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanIgnore.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanIgnore.java
@@ -40,6 +40,49 @@
 @Retention(RUNTIME)

 @Inherited

 public @interface BeanIgnore {

+	/**

+	 * Dynamically apply this annotation to the specified classes/methods/fields/constructors.

+	 *

+	 * <p>

+	 * Used in conjunction with the {@link BeanConfig#annotateBeanIgnore()}.

+	 * It is ignored when the annotation is applied directly to classes/methods/fields/constructors.

+	 *

+	 * The valid pattern matches are:

+	 * <ul>

+	 * 	<li>Classes:

+	 * 		<ul>

+	 * 			<li>Fully qualified: <js>"com.foo.MyClass"</js>

+	 * 			<li>Fully qualified inner class: <js>"com.foo.MyClass$Inner1$Inner2"</js>

+	 * 			<li>Simple: <js>"MyClass"</js>

+	 * 			<li>Simple inner: <js>"MyClass$Inner1$Inner2"</js> or <js>"Inner1$Inner2"</js> or <js>"Inner2"</js>

+	 * 		</ul>

+	 * 	<li>Methods:

+	 * 		<ul>

+	 * 			<li>Fully qualified with args: <js>"com.foo.MyClass.myMethod(String,int)"</js> or <js>"com.foo.MyClass.myMethod(java.lang.String,int)"</js> or <js>"com.foo.MyClass.myMethod()"</js>

+	 * 			<li>Fully qualified: <js>"com.foo.MyClass.myMethod"</js>

+	 * 			<li>Simple with args: <js>"MyClass.myMethod(String,int)"</js> or <js>"MyClass.myMethod(java.lang.String,int)"</js> or <js>"MyClass.myMethod()"</js>

+	 * 			<li>Simple: <js>"MyClass.myMethod"</js>

+	 * 			<li>Simple inner class: <js>"MyClass$Inner1$Inner2.myMethod"</js> or <js>"Inner1$Inner2.myMethod"</js> or <js>"Inner2.myMethod"</js>

+	 * 		</ul>

+	 * 	<li>Fields:

+	 * 		<ul>

+	 * 			<li>Fully qualified: <js>"com.foo.MyClass.myField"</js>

+	 * 			<li>Simple: <js>"MyClass.muyField"</js>

+	 * 			<li>Simple inner class: <js>"MyClass$Inner1$Inner2.myField"</js> or <js>"Inner1$Inner2.myField"</js> or <js>"Inner2.myField"</js>

+	 * 		</ul>

+	 * 	<li>Constructors:

+	 * 		<ul>

+	 * 			<li>Fully qualified with args: <js>"com.foo.MyClass(String,int)"</js> or <js>"com.foo.MyClass(java.lang.String,int)"</js> or <js>"com.foo.MyClass()"</js>

+	 * 			<li>Simple with args: <js>"MyClass(String,int)"</js> or <js>"MyClass(java.lang.String,int)"</js> or <js>"MyClass()"</js>

+	 * 			<li>Simple inner class: <js>"MyClass$Inner1$Inner2()"</js> or <js>"Inner1$Inner2()"</js> or <js>"Inner2()"</js>

+	 * 		</ul>

+	 * 	<li>A comma-delimited list of anything on this list.

+	 * </ul>

+	 *

+	 * <ul class='seealso'>

+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}

+	 * </ul>

+	 */

 	String on() default "";

 }

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanc.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanc.java
index 2e4a65b..bec5ca5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanc.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanc.java
@@ -52,20 +52,78 @@
 @Inherited

 public @interface Beanc {

 

+	/**

+	 * Dynamically apply this annotation to the specified constructors.

+	 *

+	 * <p>

+	 * Used in conjunction with the {@link BeanConfig#annotateBeanc()}.

+	 * It is ignored when the annotation is applied directly to constructors.

+	 *

+	 * <p>

+	 * The following example shows this annotation in use:

+	 * <p class='bpcode w800'>

+	 *		<jc>// Our read-only bean.</jc>

+	 *		<jk>public class</jk> Person {

+	 *			<jk>private final</jk> String <jf>name</jf>;

+	 *			<jk>private final int</jk> <jf>age</jf>;

+	 *

+	 *			<jk>public</jk> Person(String name, <jk>int</jk> age) {

+	 *				<jk>this</jk>.<jf>name</jf> = name;

+	 *				<jk>this</jk>.<jf>age</jf> = age;

+	 *			}

+	 *

+	 *			<jc>// Read only properties.</jc>

+	 *			<jc>// Getters, but no setters.</jc>

+	 *

+	 *			<jk>public</jk> String getName() {

+	 *				<jk>return</jk> <jf>name</jf>;

+	 *			}

+	 *

+	 *			<jk>public int</jk> getAge() {

+	 *				<jk>return</jk> <jf>age</jf>;

+	 *			}

+	 *		}

+	 *

+	 *		<ja>@BeanConfig</ja>(annotateBeanc=<ja>@Beanc</ja>(on="Person(String,int)", properties=<js>"name,age"</js>))

+	 *		public static class X {}

+	 * </p>

+	 * <p class='bpcode w800'>

+	 *		<jc>// Parsing into a read-only bean.</jc>

+	 *		String json = <js>"{name:'John Smith',age:45}"</js>;

+	 *		Person p = JsonParser.<jsf>DEFAULT</jsf>.builder().applyAnnotations(X.<jk>class</jk>).build().parse(json);

+	 *		String name = p.getName();  <jc>// "John Smith"</jc>

+	 *		<jk>int</jk> age = p.getAge();   <jc>// 45</jc>

+	 * </p>

+	 *

+	 * The valid pattern matches are:

+	 * <ul>

+	 * 	<li>Constructors:

+	 * 		<ul>

+	 * 			<li>Fully qualified with args: <js>"com.foo.MyClass(String,int)"</js> or <js>"com.foo.MyClass(java.lang.String,int)"</js> or <js>"com.foo.MyClass()"</js>

+	 * 			<li>Simple with args: <js>"MyClass(String,int)"</js> or <js>"MyClass(java.lang.String,int)"</js> or <js>"MyClass()"</js>

+	 * 			<li>Simple inner class: <js>"MyClass$Inner1$Inner2()"</js> or <js>"Inner1$Inner2()"</js> or <js>"Inner2()"</js>

+	 * 		</ul>

+	 * 	<li>A comma-delimited list of anything on this list.

+	 * </ul>

+	 *

+	 * <ul class='seealso'>

+	 * 	<li class='link'>{@doc juneau-marshall.DynamicallyAppliedAnnotations}

+	 * </ul>

+	 */

 	String on() default "";

 

 	/**

 	 * The names of the properties of the constructor arguments.

+	 *

 	 * <p>

-	 *	The {@link org.apache.juneau.annotation.Beanc @Beanc} annotation is used to

-	 *	map constructor arguments to property names on bean with read-only properties.

-	 * 	<br>Since method parameter names are lost during compilation, this annotation essentially redefines

-	 *	them so that they are available at runtime.

-	 *	</p>

-	 * 	<p>

-	 *	The definition of a read-only bean is a bean with properties with only getters, like shown below:

-	 *	</p>

-	 *	<p class='bpcode w800'>

+	 * The {@link org.apache.juneau.annotation.Beanc @Beanc} annotation is used to map constructor arguments to property

+	 * names on bean with read-only properties.

+	 * <br>Since method parameter names are lost during compilation, this annotation essentially redefines them so that

+	 * they are available at runtime.

+	 *

+	 * <p>

+	 * The definition of a read-only bean is a bean with properties with only getters, like shown below:

+	 * <p class='bpcode w800'>

 	 *		<jc>// Our read-only bean.</jc>

 	 *		<jk>public class</jk> Person {

 	 *			<jk>private final</jk> String <jf>name</jf>;

@@ -88,14 +146,14 @@
 	 *				<jk>return</jk> <jf>age</jf>;

 	 *			}

 	 *		}

-	 *	</p>

-	 *	<p class='bpcode w800'>

+	 * </p>

+	 * <p class='bpcode w800'>

 	 *		<jc>// Parsing into a read-only bean.</jc>

 	 *		String json = <js>"{name:'John Smith',age:45}"</js>;

 	 *		Person p = JsonParser.<jsf>DEFAULT</jsf>.parse(json);

 	 *		String name = p.getName();  <jc>// "John Smith"</jc>

 	 *		<jk>int</jk> age = p.getAge();   <jc>// 45</jc>

-	 *	</p>

+	 * </p>

 	 * <p>

 	 * 	Note that the {@link Name @Name} annotation can also be used to identify bean property names on constructor

 	 * 	arguments.  If neither this annotation or {@link Name @Name} is used, then we try to get the property names

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Swap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Swap.java
index 4c44af8..b02edc1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Swap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Swap.java
@@ -40,6 +40,8 @@
 @Inherited

 public @interface Swap {

 

+	String on() default "";

+

 	/**

 	 * The {@link PojoSwap} and {@link Surrogate} class.

 	 *

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
index 3a39b0a..9cce182 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
@@ -122,6 +122,17 @@
 		return f.isAnnotationPresent(a);
 	}
 
+	/**
+	 * Returns <jk>true</jk> if the specified annotation is present.
+	 *
+	 * @param a The annotation to check for.
+	 * @param mp The meta provider for looking up annotations on reflection objects (classes, methods, fields, constructors).
+	 * @return <jk>true</jk> if the specified annotation is present.
+	 */
+	public boolean hasAnnotation(Class<? extends Annotation> a, MetaProvider mp) {
+		return mp.getAnnotation(a, f) != null;
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Characteristics
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoListSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoListSwap.java
index 2602c4f..23d06c1 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoListSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoListSwap.java
@@ -82,27 +82,28 @@
 	/**
 	 * Look for constructors and methods on this class and construct a dynamic swap if it's possible to do so.
 	 *
+	 * @param bc The bean context to use for looking up annotations.
 	 * @param ci The class to try to constructor a dynamic swap on.
 	 * @return A POJO swap instance, or <jk>null</jk> if one could not be created.
 	 */
 	@SuppressWarnings({ "rawtypes" })
-	public static PojoSwap<?,?> find(ClassInfo ci) {
+	public static PojoSwap<?,?> find(BeanContext bc, ClassInfo ci) {
 
-		if (shouldIgnore(ci))
+		if (shouldIgnore(bc, ci))
 			return null;
 
 		// Find swap() method if present.
 		for (MethodInfo m : ci.getPublicMethods()) {
-			if (isSwapMethod(m)) {
+			if (isSwapMethod(bc, m)) {
 
 				ClassInfo rt = m.getReturnType();
 
 				for (MethodInfo m2 : ci.getPublicMethods())
-					if (isUnswapMethod(m2, ci, rt))
+					if (isUnswapMethod(bc, m2, ci, rt))
 						return new AutoListSwap(ci, m, m2, null);
 
 				for (ConstructorInfo cs : ci.getPublicConstructors())
-					if (isUnswapConstructor(cs, rt))
+					if (isUnswapConstructor(bc, cs, rt))
 						return new AutoListSwap(ci, m, null, cs);
 
 				return new AutoListSwap(ci, m, null, null);
@@ -112,37 +113,37 @@
 		return null;
 	}
 
-	private static boolean shouldIgnore(ClassInfo ci) {
+	private static boolean shouldIgnore(BeanContext bc, ClassInfo ci) {
 		return
-			ci.hasAnnotation(BeanIgnore.class)
+			bc.hasAnnotation(BeanIgnore.class, ci)
 			|| ci.isNonStaticMemberClass();
 	}
 
-	private static boolean isSwapMethod(MethodInfo mi) {
+	private static boolean isSwapMethod(BeanContext bc, MethodInfo mi) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isNotStatic()
 			&& mi.hasName(SWAP_METHOD_NAMES)
 			&& mi.hasReturnTypeParent(List.class)
 			&& mi.hasFuzzyParamTypes(BeanSession.class)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapMethod(MethodInfo mi, ClassInfo ci, ClassInfo rt) {
+	private static boolean isUnswapMethod(BeanContext bc, MethodInfo mi, ClassInfo ci, ClassInfo rt) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isStatic()
 			&& mi.hasName(UNSWAP_METHOD_NAMES)
 			&& mi.hasFuzzyParamTypes(BeanSession.class, rt.inner())
 			&& mi.hasReturnTypeParent(ci)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapConstructor(ConstructorInfo cs, ClassInfo rt) {
+	private static boolean isUnswapConstructor(BeanContext bc, ConstructorInfo cs, ClassInfo rt) {
 		return
 			cs.isNotDeprecated()
 			&& cs.hasParamTypeParents(rt)
-			&& ! cs.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, cs);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoMapSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoMapSwap.java
index 53dace1..ba1b813 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoMapSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoMapSwap.java
@@ -82,27 +82,28 @@
 	/**
 	 * Look for constructors and methods on this class and construct a dynamic swap if it's possible to do so.
 	 *
+	 * @param bc The bean context to use for looking up annotations.
 	 * @param ci The class to try to constructor a dynamic swap on.
 	 * @return A POJO swap instance, or <jk>null</jk> if one could not be created.
 	 */
 	@SuppressWarnings({ "rawtypes" })
-	public static PojoSwap<?,?> find(ClassInfo ci) {
+	public static PojoSwap<?,?> find(BeanContext bc, ClassInfo ci) {
 
-		if (shouldIgnore(ci))
+		if (shouldIgnore(bc, ci))
 			return null;
 
 		// Find swap() method if present.
 		for (MethodInfo m : ci.getPublicMethods()) {
-			if (isSwapMethod(m)) {
+			if (isSwapMethod(bc, m)) {
 
 				ClassInfo rt = m.getReturnType();
 
 				for (MethodInfo m2 : ci.getPublicMethods())
-					if (isUnswapMethod(m2, ci, rt))
+					if (isUnswapMethod(bc, m2, ci, rt))
 						return new AutoMapSwap(ci, m, m2, null);
 
 				for (ConstructorInfo cs : ci.getPublicConstructors())
-					if (isUnswapConstructor(cs, rt))
+					if (isUnswapConstructor(bc, cs, rt))
 						return new AutoMapSwap(ci, m, null, cs);
 
 				return new AutoMapSwap(ci, m, null, null);
@@ -112,37 +113,37 @@
 		return null;
 	}
 
-	private static boolean shouldIgnore(ClassInfo ci) {
+	private static boolean shouldIgnore(BeanContext bc, ClassInfo ci) {
 		return
-			ci.hasAnnotation(BeanIgnore.class)
+			bc.hasAnnotation(BeanIgnore.class, ci)
 			|| ci.isNonStaticMemberClass();
 	}
 
-	private static boolean isSwapMethod(MethodInfo mi) {
+	private static boolean isSwapMethod(BeanContext bc, MethodInfo mi) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isNotStatic()
 			&& mi.hasName(SWAP_METHOD_NAMES)
 			&& mi.hasReturnTypeParent(Map.class)
 			&& mi.hasFuzzyParamTypes(BeanSession.class)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapMethod(MethodInfo mi, ClassInfo ci, ClassInfo rt) {
+	private static boolean isUnswapMethod(BeanContext bc, MethodInfo mi, ClassInfo ci, ClassInfo rt) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isStatic()
 			&& mi.hasName(UNSWAP_METHOD_NAMES)
 			&& mi.hasFuzzyParamTypes(BeanSession.class, rt.inner())
 			&& mi.hasReturnTypeParent(ci)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapConstructor(ConstructorInfo cs, ClassInfo rt) {
+	private static boolean isUnswapConstructor(BeanContext bc, ConstructorInfo cs, ClassInfo rt) {
 		return
 			cs.isNotDeprecated()
 			&& cs.hasParamTypeParents(rt)
-			&& ! cs.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, cs);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoNumberSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoNumberSwap.java
index 80ae1cc..ebb89d6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoNumberSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoNumberSwap.java
@@ -105,27 +105,28 @@
 	/**
 	 * Look for constructors and methods on this class and construct a dynamic swap if it's possible to do so.
 	 *
+	 * @param bc The bean context to use for looking up annotations.
 	 * @param ci The class to try to constructor a dynamic swap on.
 	 * @return A POJO swap instance, or <jk>null</jk> if one could not be created.
 	 */
 	@SuppressWarnings({ "rawtypes" })
-	public static PojoSwap<?,?> find(ClassInfo ci) {
+	public static PojoSwap<?,?> find(BeanContext bc, ClassInfo ci) {
 
-		if (shouldIgnore(ci))
+		if (shouldIgnore(bc, ci))
 			return null;
 
 		// Find swap() method if present.
 		for (MethodInfo m : ci.getPublicMethods()) {
-			if (isSwapMethod(m)) {
+			if (isSwapMethod(bc, m)) {
 
 				ClassInfo rt = m.getReturnType();
 
 				for (MethodInfo m2 : ci.getPublicMethods())
-					if (isUnswapMethod(m2, ci, rt))
+					if (isUnswapMethod(bc, m2, ci, rt))
 						return new AutoNumberSwap(ci, m, m2, null);
 
 				for (ConstructorInfo cs : ci.getPublicConstructors())
-					if (isUnswapConstructor(cs, rt))
+					if (isUnswapConstructor(bc, cs, rt))
 						return new AutoNumberSwap(ci, m, null, cs);
 
 				return new AutoNumberSwap(ci, m, null, null);
@@ -135,15 +136,15 @@
 		return null;
 	}
 
-	private static boolean shouldIgnore(ClassInfo ci) {
+	private static boolean shouldIgnore(BeanContext bc, ClassInfo ci) {
 		return
-			ci.hasAnnotation(BeanIgnore.class)
+			bc.hasAnnotation(BeanIgnore.class, ci)
 			|| ci.isNonStaticMemberClass()
 			|| ci.isPrimitive()
 			|| ci.isChildOf(Number.class);
 	}
 
-	private static boolean isSwapMethod(MethodInfo mi) {
+	private static boolean isSwapMethod(BeanContext bc, MethodInfo mi) {
 		ClassInfo rt = mi.getReturnType();
 		return
 			mi.isNotDeprecated()
@@ -151,24 +152,24 @@
 			&& (rt.isChildOf(Number.class) || (rt.isPrimitive() && rt.isAny(int.class, short.class, long.class, float.class, double.class, byte.class)))
 			&& mi.hasName(SWAP_METHOD_NAMES)
 			&& mi.hasFuzzyParamTypes(BeanSession.class)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapMethod(MethodInfo mi, ClassInfo ci, ClassInfo rt) {
+	private static boolean isUnswapMethod(BeanContext bc, MethodInfo mi, ClassInfo ci, ClassInfo rt) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isStatic()
 			&& mi.hasName(UNSWAP_METHOD_NAMES)
 			&& mi.hasFuzzyParamTypes(BeanSession.class, rt.inner())
 			&& mi.hasReturnTypeParent(ci)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapConstructor(ConstructorInfo cs, ClassInfo rt) {
+	private static boolean isUnswapConstructor(BeanContext bc, ConstructorInfo cs, ClassInfo rt) {
 		return
 			cs.isNotDeprecated()
 			&& cs.hasParamTypeParents(rt)
-			&& ! cs.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, cs);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoObjectSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoObjectSwap.java
index a55f700..aea43c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoObjectSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/AutoObjectSwap.java
@@ -84,27 +84,28 @@
 	/**
 	 * Inspects the specified class and returns a swap of this type if possible.
 	 *
+	 * @param bc The bean context to use for looking up annotations.
 	 * @param ci The class to return a swap on.
 	 * @return A POJO swap instance, or <jk>null</jk> if one could not be created.
 	 */
 	@SuppressWarnings({ "rawtypes" })
-	public static PojoSwap<?,?> find(ClassInfo ci) {
+	public static PojoSwap<?,?> find(BeanContext bc, ClassInfo ci) {
 
-		if (shouldIgnore(ci))
+		if (shouldIgnore(bc, ci))
 			return null;
 
 		// Find swap() method if present.
 		for (MethodInfo m : ci.getPublicMethods()) {
-			if (isSwapMethod(m)) {
+			if (isSwapMethod(bc, m)) {
 
 				ClassInfo rt = m.getReturnType();
 
 				for (MethodInfo m2 : ci.getPublicMethods())
-					if (isUnswapMethod(m2, ci, rt))
+					if (isUnswapMethod(bc, m2, ci, rt))
 						return new AutoObjectSwap(ci, m, m2, null);
 
 				for (ConstructorInfo cs : ci.getPublicConstructors())
-					if (isUnswapConstructor(cs, rt))
+					if (isUnswapConstructor(bc, cs, rt))
 						return new AutoObjectSwap(ci, m, null, cs);
 
 				return new AutoObjectSwap(ci, m, null, null);
@@ -114,36 +115,36 @@
 		return null;
 	}
 
-	private static boolean shouldIgnore(ClassInfo ci) {
+	private static boolean shouldIgnore(BeanContext bc, ClassInfo ci) {
 		return
-			ci.hasAnnotation(BeanIgnore.class)
+			bc.hasAnnotation(BeanIgnore.class, ci)
 			|| ci.isNonStaticMemberClass();
 	}
 
-	private static boolean isSwapMethod(MethodInfo mi) {
+	private static boolean isSwapMethod(BeanContext bc, MethodInfo mi) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isNotStatic()
 			&& mi.hasName(SWAP_METHOD_NAMES)
 			&& mi.hasFuzzyParamTypes(BeanSession.class)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapMethod(MethodInfo mi, ClassInfo ci, ClassInfo rt) {
+	private static boolean isUnswapMethod(BeanContext bc, MethodInfo mi, ClassInfo ci, ClassInfo rt) {
 		return
 			mi.isNotDeprecated()
 			&& mi.isStatic()
 			&& mi.hasName(UNSWAP_METHOD_NAMES)
 			&& mi.hasFuzzyParamTypes(BeanSession.class, rt.inner())
 			&& mi.hasReturnTypeParent(ci)
-			&& ! mi.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, mi);
 	}
 
-	private static boolean isUnswapConstructor(ConstructorInfo cs, ClassInfo rt) {
+	private static boolean isUnswapConstructor(BeanContext bc, ConstructorInfo cs, ClassInfo rt) {
 		return
 			cs.isNotDeprecated()
 			&& cs.hasParamTypeParents(rt)
-			&& ! cs.hasAnnotation(BeanIgnore.class);
+			&& ! bc.hasAnnotation(BeanIgnore.class, cs);
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
index 35c0674..d6269c2 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/transform/BuilderSwap.java
@@ -175,19 +175,20 @@
 	/**

 	 * Creates a BuilderSwap from the specified POJO class if it has one.

 	 *

+	 * @param bc The bean context to use to look up annotations.

 	 * @param pojoClass The POJO class to check.

 	 * @param cVis Minimum constructor visibility.

 	 * @param mVis Minimum method visibility.

 	 * @return A new swap instance, or <jk>null</jk> if class didn't have a builder class.

 	 */

 	@SuppressWarnings("rawtypes")

-	public static BuilderSwap<?,?> findSwapFromPojoClass(Class<?> pojoClass, Visibility cVis, Visibility mVis) {

+	public static BuilderSwap<?,?> findSwapFromPojoClass(BeanContext bc, Class<?> pojoClass, Visibility cVis, Visibility mVis) {

 		Class<?> builderClass = null;

 		MethodInfo pojoCreateMethod, builderCreateMethod;

 		ConstructorInfo pojoConstructor = null;

 		ConstructorInfo builderConstructor;

 

-		org.apache.juneau.annotation.Builder b = pojoClass.getAnnotation(org.apache.juneau.annotation.Builder.class);

+		org.apache.juneau.annotation.Builder b = bc.getAnnotation(org.apache.juneau.annotation.Builder.class, pojoClass);

 

 		if (b != null && b.value() != Null.class)

 			builderClass = b.value();

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
index 4b803b9..d0bbc17 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
@@ -52,9 +52,9 @@
  * 			<li>Simple with args: <js>"MyClass(String,int)"</js> or <js>"MyClass(java.lang.String,int)"</js> or <js>"MyClass()"</js>
  * 			<li>Simple inner class: <js>"MyClass$Inner1$Inner2()"</js> or <js>"Inner1$Inner2()"</js> or <js>"Inner2()"</js>
  * 		</ul>
+ * 	<li>A comma-delimited list of anything on this list.
  * </ul>
  *
- *
  * @param <V> The type of object in this map.
  */
 public class ReflectionMap<V> {