diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PojoExamplesTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PojoExamplesTest.java
index d0bd98f..66a1649 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PojoExamplesTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/PojoExamplesTest.java
@@ -61,6 +61,24 @@
 		}
 	}
 
+	@Test
+	public void testExampleField_usingConfig() throws Exception {
+		BeanSession bs = BeanContext.create().applyAnnotations(B1c.class).build().createSession();
+		assertObjectEquals("{f1:'f1b'}", bs.getClassMeta(B1c.class).getExample(bs));
+	}
+
+	@BeanConfig(applyExample=@Example(on="B1c.EXAMPLE"))
+	public static class B1c {
+		public String f1;
+
+		public static B1c EXAMPLE = new B1c().init();
+
+		public B1c init() {
+			this.f1 = "f1b";
+			return this;
+		}
+	}
+
 	//====================================================================================================
 	// test @Example on private field
 	//====================================================================================================
@@ -82,6 +100,25 @@
 		}
 	}
 
+	@Test
+	public void testExampleFieldPrivate_usingConfig() throws Exception {
+		BeanSession bs = BeanContext.create().applyAnnotations(B2c.class).build().createSession();
+		assertObjectEquals("{f1:'f1b'}", bs.getClassMeta(B2c.class).getExample(bs));
+	}
+
+	@BeanConfig(applyExample=@Example(on="B2c.EXAMPLE"))
+	public static class B2c {
+		public String f1;
+
+		@SuppressWarnings("unused")
+		private static B2c EXAMPLE = new B2c().init();
+
+		public B2c init() {
+			this.f1 = "f1b";
+			return this;
+		}
+	}
+
 	//====================================================================================================
 	// test @Example on public no-arg method.
 	//====================================================================================================
@@ -105,6 +142,26 @@
 		}
 	}
 
+	@Test
+	public void testExampleOnPublicNoArgMethod_usingConfig() throws Exception {
+		BeanSession bs = BeanContext.create().applyAnnotations(C1c.class).build().createSession();
+		assertObjectEquals("{f1:'f1c'}", bs.getClassMeta(C1c.class).getExample(bs));
+	}
+
+	@BeanConfig(applyExample=@Example(on="C1c.x"))
+	public static class C1c {
+		public String f1;
+
+		public C1c init() {
+			this.f1 = "f1c";
+			return this;
+		}
+
+		public static C1c x() {
+			return new C1c().init();
+		}
+	}
+
 	//====================================================================================================
 	// test @Example on private no-arg method.
 	//====================================================================================================
@@ -128,6 +185,27 @@
 		}
 	}
 
+	@Test
+	public void testExampleOnPrivateNoArgMethod_usingConfig() throws Exception {
+		BeanSession bs = BeanContext.create().applyAnnotations(C2c.class).build().createSession();
+		assertObjectEquals("{f1:'f1c'}", bs.getClassMeta(C2c.class).getExample(bs));
+	}
+
+	@BeanConfig(applyExample=@Example(on="C2c.x"))
+	public static class C2c {
+		public String f1;
+
+		public C2c init() {
+			this.f1 = "f1c";
+			return this;
+		}
+
+		@SuppressWarnings("unused")
+		private static C2c x() {
+			return new C2c().init();
+		}
+	}
+
 	//====================================================================================================
 	// test @Example on public 1-arg method
 	//====================================================================================================
@@ -151,6 +229,26 @@
 		}
 	}
 
+	@Test
+	public void testExampleOnPublicOneArgMethod_usingConfig() throws Exception {
+		BeanSession bs = BeanContext.create().applyAnnotations(D1c.class).build().createSession();
+		assertObjectEquals("{f1:'f1d'}", bs.getClassMeta(D1c.class).getExample(bs));
+	}
+
+	@BeanConfig(applyExample=@Example(on="D1c.x(BeanSession)"))
+	public static class D1c {
+		public String f1;
+
+		public D1c init() {
+			this.f1 = "f1d";
+			return this;
+		}
+
+		public static D1c x(BeanSession bs) {
+			return new D1c().init();
+		}
+	}
+
 	//====================================================================================================
 	// test example() method, no annotation.
 	//====================================================================================================
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
index c79dccd..d3505ef 100755
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorTest.java
@@ -300,28 +300,58 @@
 	@Test
 	public void addExample_BEAN_exampleMethod() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(B1.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleMethod_wDefault() throws Exception {
-		SimpleBeanWithExampleMethod b = new SimpleBeanWithExampleMethod();
+		B1 b = new B1();
 		b.f1 = "baz";
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod.class, b).build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(SimpleBeanWithExampleMethod.class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(B1.class, b).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(B1.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleMethod_array2d() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleMethod[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B1[][].class));
 	}
 
-	public static class SimpleBeanWithExampleMethod extends SimpleBean {
+	public static class B1 extends SimpleBean {
 
 		@Example
-		public static SimpleBeanWithExampleMethod example() {
-			SimpleBeanWithExampleMethod ex = new SimpleBeanWithExampleMethod();
+		public static B1 example() {
+			B1 ex = new B1();
+			ex.f1 = "foobar";
+			return ex;
+		}
+	}
+
+	@Test
+	public void addExample_BEAN_exampleMethod_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B1c.class).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(B1c.class));
+	}
+
+	@Test
+	public void addExample_BEAN_exampleMethod_wDefault_usingConfig() throws Exception {
+		B1c b = new B1c();
+		b.f1 = "baz";
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B1c.class).example(B1c.class, b).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(B1c.class));
+	}
+
+	@Test
+	public void addExample_BEAN_exampleMethod_array2d_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B1c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B1c[][].class));
+	}
+
+	@BeanConfig(applyExample=@Example(on="B1c.example"))
+	public static class B1c extends SimpleBean {
+
+		public static B1c example() {
+			B1c ex = new B1c();
 			ex.f1 = "foobar";
 			return ex;
 		}
@@ -329,23 +359,47 @@
 
 	@Test
 	public void addExample_BEAN_exampleMethodOverridden_wDefault() throws Exception {
-		SimpleBeanWithExampleMethod2 b = new SimpleBeanWithExampleMethod2();
+		B2 b = new B2();
 		b.f1 = "baz";
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(SimpleBeanWithExampleMethod2.class, b).build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(SimpleBeanWithExampleMethod2.class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").example(B2.class, b).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(B2.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleMethodOverridden_array2d() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleMethod2[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B2[][].class));
 	}
 
-	public static class SimpleBeanWithExampleMethod2 extends SimpleBeanWithExampleMethod {
+	public static class B2 extends B1 {
 
 		@Example
-		public static SimpleBeanWithExampleMethod2 example2() {
-			SimpleBeanWithExampleMethod2 ex = new SimpleBeanWithExampleMethod2();
+		public static B2 example2() {
+			B2 ex = new B2();
+			ex.f1 = "foobar";
+			return ex;
+		}
+	}
+
+	@Test
+	public void addExample_BEAN_exampleMethodOverridden_wDefault_usingConfig() throws Exception {
+		B2c b = new B2c();
+		b.f1 = "baz";
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B2c.class).example(B2c.class, b).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'baz'}}", s.getSchema(B2c.class));
+	}
+
+	@Test
+	public void addExample_BEAN_exampleMethodOverridden_array2d_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B2c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B2c[][].class));
+	}
+
+	@BeanConfig(applyExample=@Example(on="B2c.example2"))
+	public static class B2c extends B1c {
+
+		public static B2c example2() {
+			B2c ex = new B2c();
 			ex.f1 = "foobar";
 			return ex;
 		}
@@ -354,22 +408,46 @@
 	@Test
 	public void addExample_BEAN_exampleField() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleField.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(B3.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleField_array2d() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleField[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B3[][].class));
 	}
 
-	public static class SimpleBeanWithExampleField extends SimpleBean {
+	public static class B3 extends SimpleBean {
 
 		@Example
-		public static SimpleBeanWithExampleField EXAMPLE = getExample();
+		public static B3 EXAMPLE = getExample();
 
-		private static SimpleBeanWithExampleField getExample() {
-			SimpleBeanWithExampleField ex = new SimpleBeanWithExampleField();
+		private static B3 getExample() {
+			B3 ex = new B3();
+			ex.f1 = "foobar";
+			return ex;
+		}
+	}
+
+	@Test
+	public void addExample_BEAN_exampleField_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B3c.class).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(B3c.class));
+	}
+
+	@Test
+	public void addExample_BEAN_exampleField_array2d_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B3c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B3c[][].class));
+	}
+
+	@BeanConfig(applyExample=@Example(on="B3c.EXAMPLE"))
+	public static class B3c extends SimpleBean {
+
+		public static B3c EXAMPLE = getExample();
+
+		private static B3c getExample() {
+			B3c ex = new B3c();
 			ex.f1 = "foobar";
 			return ex;
 		}
@@ -378,17 +456,32 @@
 	@Test
 	public void addExample_BEAN_exampleBeanAnnotation() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(SimpleBeanWithExampleAnnotation.class));
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(B4.class));
 	}
 
 	@Test
 	public void addExample_BEAN_exampleBeanAnnotation_2darray() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(SimpleBeanWithExampleAnnotation[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B4[][].class));
 	}
 
 	@Example("{f1:'foobar'}")
-	public static class SimpleBeanWithExampleAnnotation extends SimpleBean {}
+	public static class B4 extends SimpleBean {}
+
+	@Test
+	public void addExample_BEAN_exampleBeanAnnotation_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B4c.class).build().createSession();
+		assertObjectEquals("{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}", s.getSchema(B4c.class));
+	}
+
+	@Test
+	public void addExample_BEAN_exampleBeanAnnotation_2darray_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("bean").applyAnnotations(B4c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}},'x-example':{f1:'foobar'}}}}", s.getSchema(B4c[][].class));
+	}
+
+	@BeanConfig(applyExample=@Example(on="B4c", value="{f1:'foobar'}"))
+	public static class B4c extends SimpleBean {}
 
 	@Test
 	public void addExample_BEAN_exampleBeanProperty() throws Exception {
@@ -419,24 +512,49 @@
 	@Test
 	public void addExample_MAP_exampleMethod() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(C1.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleMethod_wDefault() throws Exception {
-		BeanMapWithExampleMethod b = new BeanMapWithExampleMethod();
-		b.put(456, SimpleBeanWithExampleMethod.example());
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMapWithExampleMethod.class, b).build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'456':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
+		C1 b = new C1();
+		b.put(456, B1.example());
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(C1.class, b).build().createSession();
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'456':{f1:'foobar'}}}", s.getSchema(C1.class));
 	}
 
 	@SuppressWarnings("serial")
-	public static class BeanMapWithExampleMethod extends BeanMap {
+	public static class C1 extends BeanMap {
 
 		@Example
-		public static BeanMapWithExampleMethod example() {
-			BeanMapWithExampleMethod m = new BeanMapWithExampleMethod();
-			m.put(123, SimpleBeanWithExampleMethod.example());
+		public static C1 example() {
+			C1 m = new C1();
+			m.put(123, B1.example());
+			return m;
+		}
+	}
+
+	@Test
+	public void addExample_MAP_exampleMethod_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").applyAnnotations(C1c.class).build().createSession();
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(C1c.class));
+	}
+
+	@Test
+	public void addExample_MAP_exampleMethod_wDefault_usingConfig() throws Exception {
+		C1c b = new C1c();
+		b.put(456, B1.example());
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").applyAnnotations(C1c.class).example(C1c.class, b).build().createSession();
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'456':{f1:'foobar'}}}", s.getSchema(C1c.class));
+	}
+
+	@BeanConfig(applyExample=@Example(on="C1c.example"))
+	@SuppressWarnings("serial")
+	public static class C1c extends BeanMap {
+
+		public static C1c example() {
+			C1c m = new C1c();
+			m.put(123, B1.example());
 			return m;
 		}
 	}
@@ -444,24 +562,49 @@
 	@Test
 	public void addExample_MAP_exampleField() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleField.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(C2.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleField_array2d() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMapWithExampleField[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(C2[][].class));
 	}
 
 	@SuppressWarnings("serial")
-	public static class BeanMapWithExampleField extends BeanMap {
+	public static class C2 extends BeanMap {
 
 		@Example
-		public static BeanMapWithExampleField EXAMPLE = getExample();
+		public static C2 EXAMPLE = getExample();
 
-		private static BeanMapWithExampleField getExample() {
-			BeanMapWithExampleField ex = new BeanMapWithExampleField();
-			ex.put(123, SimpleBeanWithExampleMethod.example());
+		private static C2 getExample() {
+			C2 ex = new C2();
+			ex.put(123, B1.example());
+			return ex;
+		}
+	}
+
+	@Test
+	public void addExample_MAP_exampleField_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").applyAnnotations(C2c.class).build().createSession();
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(C2c.class));
+	}
+
+	@Test
+	public void addExample_MAP_exampleField_array2d_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").applyAnnotations(C2c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(C2c[][].class));
+	}
+
+	@SuppressWarnings("serial")
+	@BeanConfig(applyExample=@Example(on="C2c.EXAMPLE"))
+	public static class C2c extends BeanMap {
+
+		public static C2c EXAMPLE = getExample();
+
+		private static C2c getExample() {
+			C2c ex = new C2c();
+			ex.put(123, B1.example());
 			return ex;
 		}
 	}
@@ -469,28 +612,44 @@
 	@Test
 	public void addExample_MAP_exampleBeanAnnotation() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}", s.getSchema(BeanMapWithExampleAnnotation.class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}", s.getSchema(C3.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleBeanAnnotation_2darray() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}}}", s.getSchema(BeanMapWithExampleAnnotation[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}}}", s.getSchema(C3[][].class));
 	}
 
 	@SuppressWarnings("serial")
 	@Example("{'123':{f1:'baz'}}")
-	public static class BeanMapWithExampleAnnotation extends BeanMap {}
+	public static class C3 extends BeanMap {}
+
+	@Test
+	public void addExample_MAP_exampleBeanAnnotation_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").applyAnnotations(C3c.class).build().createSession();
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}", s.getSchema(C3c.class));
+	}
+
+	@Test
+	public void addExample_MAP_exampleBeanAnnotation_2darray_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").applyAnnotations(C3c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'baz'}}}}}", s.getSchema(C3c[][].class));
+	}
+
+	@SuppressWarnings("serial")
+	@BeanConfig(applyExample=@Example(on="C3c", value="{'123':{f1:'baz'}}"))
+	public static class C3c extends BeanMap {}
 
 	@Test
 	public void addExample_MAP_exampleBeanProperty() throws Exception {
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, C1.example()).build().createSession();
 		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMap.class));
 	}
 
 	@Test
 	public void addExample_MAP_exampleBeanProperty_2darray() throws Exception {
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, BeanMapWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("map").example(BeanMap.class, C1.example()).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}}}", s.getSchema(BeanMap[][].class));
 	}
 
@@ -507,26 +666,53 @@
 	@Test
 	public void addExample_COLLECTION_exampleMethod() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(D1.class));
 	}
 
 	@Test
 	public void addExample_COLLECTION_exampleMethod_wDefault() throws Exception {
-		BeanListWithExampleMethod b = new BeanListWithExampleMethod();
+		D1 b = new D1();
 		SimpleBean sb = new SimpleBean();
 		sb.f1 = "baz";
 		b.add(sb);
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanListWithExampleMethod.class, b).build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleMethod.class));
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(D1.class, b).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(D1.class));
 	}
 
 	@SuppressWarnings("serial")
-	public static class BeanListWithExampleMethod extends BeanList {
+	public static class D1 extends BeanList {
 
 		@Example
-		public static BeanListWithExampleMethod example() {
-			BeanListWithExampleMethod m = new BeanListWithExampleMethod();
-			m.add(SimpleBeanWithExampleMethod.example());
+		public static D1 example() {
+			D1 m = new D1();
+			m.add(B1.example());
+			return m;
+		}
+	}
+
+	@Test
+	public void addExample_COLLECTION_exampleMethod_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").applyAnnotations(D1c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(D1c.class));
+	}
+
+	@Test
+	public void addExample_COLLECTION_exampleMethod_wDefault_usingConfig() throws Exception {
+		D1c b = new D1c();
+		SimpleBean sb = new SimpleBean();
+		sb.f1 = "baz";
+		b.add(sb);
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").applyAnnotations(D1c.class).example(D1c.class, b).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(D1c.class));
+	}
+
+	@BeanConfig(applyExample=@Example(on="D1c.example"))
+	@SuppressWarnings("serial")
+	public static class D1c extends BeanList {
+
+		public static D1c example() {
+			D1c m = new D1c();
+			m.add(B1.example());
 			return m;
 		}
 	}
@@ -534,24 +720,49 @@
 	@Test
 	public void addExample_COLLECTION_exampleField() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleField.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(D2.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleField_array2d() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(D2[][].class));
 	}
 
 	@SuppressWarnings("serial")
-	public static class BeanListWithExampleField extends BeanList {
+	public static class D2 extends BeanList {
 
 		@Example
-		public static BeanListWithExampleField EXAMPLE = getExample();
+		public static D2 EXAMPLE = getExample();
 
-		private static BeanListWithExampleField getExample() {
-			BeanListWithExampleField ex = new BeanListWithExampleField();
-			ex.add(SimpleBeanWithExampleMethod.example());
+		private static D2 getExample() {
+			D2 ex = new D2();
+			ex.add(B1.example());
+			return ex;
+		}
+	}
+
+	@Test
+	public void addExample_COLLECTION_exampleField_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").applyAnnotations(D2c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(D2c.class));
+	}
+
+	@Test
+	public void addExample_ARRAY_exampleField_array2d_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").applyAnnotations(D2c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(D2c[][].class));
+	}
+
+	@SuppressWarnings("serial")
+	@BeanConfig(applyExample=@Example(on="D2c.EXAMPLE"))
+	public static class D2c extends BeanList {
+
+		public static D2c EXAMPLE = getExample();
+
+		private static D2c getExample() {
+			D2c ex = new D2c();
+			ex.add(B1.example());
 			return ex;
 		}
 	}
@@ -559,28 +770,44 @@
 	@Test
 	public void addExample_COLLECTION_exampleBeanAnnotation() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(BeanListWithExampleAnnotation.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(D3.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleBeanAnnotation_2darray() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").build().createSession();
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'baz'}]]]}", s.getSchema(BeanListWithExampleAnnotation[][].class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'baz'}]]]}", s.getSchema(D3[][].class));
 	}
 
 	@SuppressWarnings("serial")
 	@Example("[{f1:'baz'}]")
-	public static class BeanListWithExampleAnnotation extends BeanList {}
+	public static class D3 extends BeanList {}
+
+	@Test
+	public void addExample_COLLECTION_exampleBeanAnnotation_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").applyAnnotations(D3c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'baz'}]}", s.getSchema(D3c.class));
+	}
+
+	@Test
+	public void addExample_ARRAY_exampleBeanAnnotation_2darray_usingConfig() throws Exception {
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").applyAnnotations(D3c.class).build().createSession();
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'baz'}]]]}", s.getSchema(D3c[][].class));
+	}
+
+	@SuppressWarnings("serial")
+	@BeanConfig(applyExample=@Example(on="D3c", value="[{f1:'baz'}]"))
+	public static class D3c extends BeanList {}
 
 	@Test
 	public void addExample_COLLECTION_exampleBeanProperty() throws Exception {
-		JsonSchemaGeneratorSession s =JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s =JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("collection").example(BeanList.class, D1.example()).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanList.class));
 	}
 
 	@Test
 	public void addExample_ARRAY_exampleBeanProperty_2darray() throws Exception {
-		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").example(BeanList.class, BeanListWithExampleMethod.example()).build().createSession();
+		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("array").example(BeanList.class, D1.example()).build().createSession();
 		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanList[][].class));
 	}
 
@@ -767,9 +994,9 @@
 	public void addExample_ANY() throws Exception {
 		JsonSchemaGeneratorSession s = JsonSchemaGenerator.DEFAULT.builder().addExamplesTo("any").build().createSession();
 		assertObjectEquals("{type:'object',properties:{f1:{type:'string','x-example':'foo'}}}", s.getSchema(SimpleBean.class));
-		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(BeanMapWithExampleMethod.class));
-		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(BeanListWithExampleMethod.class));
-		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(BeanListWithExampleField[][].class));
+		assertObjectEquals("{type:'object',additionalProperties:{type:'object',properties:{f1:{type:'string'}}},'x-example':{'123':{f1:'foobar'}}}", s.getSchema(C1.class));
+		assertObjectEquals("{type:'array',items:{type:'object',properties:{f1:{type:'string'}}},'x-example':[{f1:'foobar'}]}", s.getSchema(D1.class));
+		assertObjectEquals("{type:'array',items:{type:'array',items:{type:'array',items:{type:'object',properties:{f1:{type:'string'}}}}},'x-example':[[[{f1:'foobar'}]]]}", s.getSchema(D2[][].class));
 		assertObjectEquals("{type:'boolean','x-example':true}", s.getSchema(boolean.class));
 		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(short.class));
 		assertObjectEquals("{type:'integer',format:'int16','x-example':1}", s.getSchema(Short.class));
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java
index 1063250..4a9a499 100644
--- a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java
@@ -44,12 +44,12 @@
 	static ReflectionMap<Number>
 		A1_SIMPLE = create().append("A1", 1).build(),
 		A1b_SIMPLE = create().append("ReflectionMapTest$A1", 1).build(),
-		A1_FULL = create().append("org.apache.juneau.utils.ReflectionMapTest$A1", 1).build();
+		A1_FULL = create().append("org.apache.juneau.utils.ReflectionMapTest$A1", 1).build();  // Note this could be a static field.
 
 	@Test
 	public void a01_classNames_checkEntries() {
 		checkEntries(A1_SIMPLE, true, false, false, false);
-		checkEntries(A1_FULL, true, false, false, false);
+		checkEntries(A1_FULL, true, false, true, false);
 	}
 
 	private void checkA(Class<?> c, boolean match_A1_SIMPLE, boolean match_A1b_SIMPLE, boolean match_A1_FULL) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java
index 0565fca..462ef57 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Beanp.java
@@ -219,7 +219,7 @@
 	 * </ul>
 	 *
 	 * <ul class='seealso'>
-	 * 	<li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
+	 * 	<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/Example.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Example.java
index a4c96f3..1c5d0a4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Example.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/Example.java
@@ -61,6 +61,49 @@
 @Inherited
 public @interface Example {
 
+	/**
+	 * Defines which classes/methods/fields this annotation applies to.
+	 *
+	 * <p>
+	 * Used in conjunction with the {@link BeanConfig#applyExample()}.
+	 * It is ignored when the annotation is applied directly to classes/methods/fields.
+	 *
+	 * The format can be any of the following:
+	 * <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/utils/ReflectionMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
index d0bbc17..af358f9 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
@@ -133,8 +133,11 @@
 						}
 					} else {
 						int i = k.lastIndexOf('.');
-						if (i == -1 || isUpperCase(k.charAt(i+1))) {
+						if (i == -1) {
 							classEntries.add(new ClassEntry<>(k, value));
+						} else if (isUpperCase(k.charAt(i+1))) {
+							classEntries.add(new ClassEntry<>(k, value));
+							fieldEntries.add(new FieldEntry<>(k, value));
 						} else {
 							methodEntries.add(new MethodEntry<>(k, value));
 							fieldEntries.add(new FieldEntry<>(k, value));
