JUNEAU-169 Dynamic annotations.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
index 4c2b721..daeb25e 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
@@ -28,14 +28,14 @@
 	 * Constructor.

 	 *

 	 * @param beanMeta The metadata on the bean that this metadata applies to.

-	 * @param rdfMetaProvider RDF metadata provider (for finding information about other artifacts).

+	 * @param mp RDF metadata provider (for finding information about other artifacts).

 	 */

-	public RdfBeanMeta(BeanMeta<?> beanMeta, RdfMetaProvider rdfMetaProvider) {

+	public RdfBeanMeta(BeanMeta<?> beanMeta, RdfMetaProvider mp) {

 		super(beanMeta);

 

 		BeanPropertyMeta t_beanUriProperty = null;

 		for (BeanPropertyMeta p : beanMeta.getPropertyMetas()) {

-			RdfBeanPropertyMeta bpm = rdfMetaProvider.getRdfBeanPropertyMeta(p);

+			RdfBeanPropertyMeta bpm = mp.getRdfBeanPropertyMeta(p);

 			if (bpm.isBeanUri())

 				t_beanUriProperty = p;

 		}

diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
index ec1eaff..108b339 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
@@ -38,13 +38,13 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param rdfMetaProvider RDF metadata provider (for finding information about other artifacts).

+	 * @param mp RDF metadata provider (for finding information about other artifacts).

 	 */

-	public RdfBeanPropertyMeta(BeanPropertyMeta bpm, RdfMetaProvider rdfMetaProvider) {

+	public RdfBeanPropertyMeta(BeanPropertyMeta bpm, RdfMetaProvider mp) {

 		super(bpm);

 

-		List<Rdf> rdfs = bpm.findAnnotations(Rdf.class);

-		List<RdfSchema> schemas = bpm.findAnnotations(RdfSchema.class);

+		List<Rdf> rdfs = bpm.findAnnotations(Rdf.class, mp);

+		List<RdfSchema> schemas = bpm.findAnnotations(RdfSchema.class, mp);

 

 		for (Rdf rdf : rdfs) {

 			if (collectionFormat == RdfCollectionFormat.DEFAULT)

diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
index ac1fe64..8161a74 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
@@ -33,19 +33,19 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param rdfMetaProvider RDF metadata provider (for finding information about other artifacts).

+	 * @param mp RDF metadata provider (for finding information about other artifacts).

 	 */

-	public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider rdfMetaProvider) {

+	public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider mp) {

 		super(cm);

 		ClassInfo ci = cm.getInfo();

-		this.rdf = ci.getAnnotation(Rdf.class);

+		this.rdf = mp.getAnnotation(Rdf.class, cm.getInnerClass());

 		if (rdf != null) {

 			collectionFormat = rdf.collectionFormat();

 		} else {

 			collectionFormat = RdfCollectionFormat.DEFAULT;

 		}

-		List<Rdf> rdfs = ci.getAnnotations(Rdf.class);

-		List<RdfSchema> schemas = ci.getAnnotations(RdfSchema.class);

+		List<Rdf> rdfs = ci.getAnnotations(Rdf.class, mp);

+		List<RdfSchema> schemas = ci.getAnnotations(RdfSchema.class, mp);

 		this.namespace = RdfUtils.findNamespace(rdfs, schemas);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index ca2da56..f174f09 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -52,7 +52,6 @@
 	private final Field field;                                // The bean property field (if it has one).

 	private final Field innerField;                                // The bean property field (if it has one).

 	private final Method getter, setter, extraKeys;           // The bean property getter and setter.

-	private final MethodInfo getterInfo, setterInfo, extraKeysInfo;           // The bean property getter and setter.

 	private final boolean isUri;                              // True if this is a URL/URI or annotated with @URI.

 	private final boolean isDyna, isDynaGetterMap;            // This is a dyna property (i.e. name="*")

 

@@ -416,11 +415,8 @@
 		this.field = b.field;

 		this.innerField = b.innerField;

 		this.getter = b.getter;

-		this.getterInfo = MethodInfo.of(b.getter);

 		this.setter = b.setter;

-		this.setterInfo = MethodInfo.of(b.setter);

 		this.extraKeys = b.extraKeys;

-		this.extraKeysInfo = MethodInfo.of(b.extraKeys);

 		this.isUri = b.isUri;

 		this.beanMeta = b.beanMeta;

 		this.beanContext = b.beanContext;

@@ -1127,57 +1123,59 @@
 	 * Searches through the class hierarchy (e.g. superclasses, interfaces, packages) for all instances of the

 	 * specified annotation.

 	 *

+	 * @param <A> The class to find annotations for.

 	 * @param a The class to find annotations for.

+	 * @param mp The metadata provider for finding annotations.

 	 * @return A list of annotations ordered in child-to-parent order.  Never <jk>null</jk>.

 	 */

-	public <A extends Annotation> List<A> findAnnotations(Class<A> a) {

+	public <A extends Annotation> List<A> findAnnotations(Class<A> a, MetaProvider mp) {

 		List<A> l = new LinkedList<>();

 		if (field != null) {

-			addIfNotNull(l, field.getAnnotation(a));

-			ClassInfo.of(field.getType()).appendAnnotations(l, a);

+			addIfNotNull(l, mp.getAnnotation(a, field));

+			ClassInfo.of(field.getType()).appendAnnotations(l, a, mp);

 		}

 		if (getter != null) {

-			addIfNotNull(l, MethodInfo.of(getter).getAnnotation(a));

-			ClassInfo.of(getter.getReturnType()).appendAnnotations(l, a);

+			addIfNotNull(l, mp.getAnnotation(a, getter));

+			ClassInfo.of(getter.getReturnType()).appendAnnotations(l, a, mp);

 		}

 		if (setter != null) {

-			addIfNotNull(l, MethodInfo.of(setter).getAnnotation(a));

-			ClassInfo.of(setter.getReturnType()).appendAnnotations(l, a);

+			addIfNotNull(l, mp.getAnnotation(a, setter));

+			ClassInfo.of(setter.getReturnType()).appendAnnotations(l, a, mp);

 		}

 		if (extraKeys != null) {

-			addIfNotNull(l, MethodInfo.of(extraKeys).getAnnotation(a));

-			ClassInfo.of(extraKeys.getReturnType()).appendAnnotations(l, a);

+			addIfNotNull(l, mp.getAnnotation(a, extraKeys));

+			ClassInfo.of(extraKeys.getReturnType()).appendAnnotations(l, a, mp);

 		}

 

-		getBeanMeta().getClassMeta().getInfo().appendAnnotations(l, a);

+		getBeanMeta().getClassMeta().getInfo().appendAnnotations(l, a, mp);

 		return l;

 	}

 

-	/**

-	 * Returns the specified annotation on the field or methods that define this property.

-	 *

-	 * <p>

-	 * This method will search up the parent class/interface hierarchy chain to search for the annotation on

-	 * overridden getters and setters.

-	 *

-	 * @param a The annotation to search for.

-	 * @return The annotation, or <jk>null</jk> if it wasn't found.

-	 */

-	public <A extends Annotation> A findAnnotation(Class<A> a) {

-		A t = null;

-		if (field != null)

-			t = field.getAnnotation(a);

-		if (t == null && getter != null)

-			t = getterInfo.getAnnotation(a);

-		if (t == null && setter != null)

-			t = setterInfo.getAnnotation(a);

-		if (t == null && extraKeys != null)

-			t = extraKeysInfo.getAnnotation(a);

-		if (t == null)

-			t = typeMeta.getInfo().getAnnotation(a);

-		return t;

-	}

-

+//	/**

+//	 * Returns the specified annotation on the field or methods that define this property.

+//	 *

+//	 * <p>

+//	 * This method will search up the parent class/interface hierarchy chain to search for the annotation on

+//	 * overridden getters and setters.

+//	 *

+//	 * @param a The annotation to search for.

+//	 * @return The annotation, or <jk>null</jk> if it wasn't found.

+//	 */

+//	public <A extends Annotation> A findAnnotation(Class<A> a) {

+//		A t = null;

+//		if (field != null)

+//			t = field.getAnnotation(a);

+//		if (t == null && getter != null)

+//			t = getterInfo.getAnnotation(a);

+//		if (t == null && setter != null)

+//			t = setterInfo.getAnnotation(a);

+//		if (t == null && extraKeys != null)

+//			t = extraKeysInfo.getAnnotation(a);

+//		if (t == null)

+//			t = typeMeta.getInfo().getAnnotation(a);

+//		return t;

+//	}

+//

 	private Object transform(BeanSession session, Object o) throws SerializeException {

 		try {

 			// First use swap defined via @Beanp.

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index 27c1176..afbd32e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -13,11 +13,13 @@
 package org.apache.juneau;
 
 import java.lang.annotation.*;
+import java.lang.reflect.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
+import org.apache.juneau.utils.*;
 
 /**
  * A reusable stateless thread-safe read-only configuration, typically used for creating one-time use {@link Session}
@@ -40,7 +42,7 @@
  *
  * @see PropertyStore
  */
-public abstract class Context {
+public abstract class Context implements MetaProvider {
 
 	static final String PREFIX = "Context";
 
@@ -66,7 +68,7 @@
 	 * Allows you to dynamically apply Juneau annotations typically applied directly to classes and methods.
 	 * Useful in cases where you want to use the functionality of the annotation on beans and bean properties but
 	 * do not have access to the code to do so.
-	 * 
+	 *
 	 * <p>
 	 * As a rule, any Juneau annotation with an <c>on()</c> method can be used with this property.
 	 *
@@ -95,6 +97,7 @@
 
 	private final PropertyStore propertyStore;
 	private final int identityCode;
+	private final ReflectionMap<Annotation> annotations;
 
 	/**
 	 * Constructor for this class.
@@ -108,6 +111,18 @@
 	public Context(PropertyStore ps, boolean allowReuse) {
 		this.propertyStore = ps == null ? PropertyStore.DEFAULT : ps;
 		this.identityCode = allowReuse ? new HashCode().add(getClass().getName()).add(ps).get() : System.identityHashCode(this);
+
+		ReflectionMap.Builder<Annotation> rmb = ReflectionMap.create(Annotation.class);
+		for (Annotation a : propertyStore.getListProperty(CONTEXT_annotations, Annotation.class)) {
+			try {
+				Method m = a.getClass().getMethod("on");
+				String on = (String)m.invoke(a);
+				rmb.append(on, a);
+			} catch (Exception e) {
+				throw new ConfigException("Invalid annotation @{0} used in CONTEXT_annotations property.  Annotation must define an on() method.", a.getClass().getSimpleName());
+			}
+		}
+		this.annotations = rmb.build();
 	}
 
 	/**
@@ -585,6 +600,40 @@
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
+	// MetaProvider methods
+	//-----------------------------------------------------------------------------------------------------------------
+
+	@SuppressWarnings("unchecked")
+	@Override /* MetaProvider */
+	public <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c) {
+		return (A)annotations.findFirst(c, a).orElse(c.getAnnotation(a));
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override /* MetaProvider */
+	public <A extends Annotation> A getDeclaredAnnotation(Class<A> a, Class<?> c) {
+		return (A)annotations.findFirst(c, a).orElse(c.getAnnotation(a));
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override /* MetaProvider */
+	public <A extends Annotation> A getAnnotation(Class<A> a, Method m) {
+		return (A)annotations.findFirst(m, a).orElse(m.getAnnotation(a));
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override /* MetaProvider */
+	public <A extends Annotation> A getAnnotation(Class<A> a, Field f) {
+		return (A)annotations.findFirst(f, a).orElse(f.getAnnotation(a));
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override /* MetaProvider */
+	public <A extends Annotation> A getAnnotation(Class<A> a, Constructor<?> c) {
+		return (A)annotations.findFirst(c, a).orElse(c.getAnnotation(a));
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
 	// Other methods
 	//-----------------------------------------------------------------------------------------------------------------
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
index 6bdd5e2..1791e63 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
@@ -12,7 +12,92 @@
 // ***************************************************************************************************************************
 package org.apache.juneau;
 
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+
 /**
  * Parent interface for all class/method language-specific metadata providers.
  */
-public interface MetaProvider {}
+public interface MetaProvider {
+
+	/**
+	 * Default metadata provider.
+	 */
+	public static MetaProvider DEFAULT = new MetaProvider() {
+
+		@Override /* MetaProvider */
+		public <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c) {
+			return c.getAnnotation(a);
+		}
+
+		@Override /* MetaProvider */
+		public <A extends Annotation> A getDeclaredAnnotation(Class<A> a, Class<?> c) {
+			return c.getDeclaredAnnotation(a);
+		}
+
+		@Override /* MetaProvider */
+		public <A extends Annotation> A getAnnotation(Class<A> a, Method m) {
+			return m.getAnnotation(a);
+		}
+
+		@Override /* MetaProvider */
+		public <A extends Annotation> A getAnnotation(Class<A> a, Field f) {
+			return f.getAnnotation(a);
+		}
+
+		@Override /* MetaProvider */
+		public <A extends Annotation> A getAnnotation(Class<A> a, Constructor<?> c) {
+			return c.getAnnotation(a);
+		}
+	};
+
+	/**
+	 * Finds the specified annotation on the specified class.
+	 *
+	 * @param <A> The annotation type to find.
+	 * @param a The annotation type to find.
+	 * @param c The class to search on.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	<A extends Annotation> A getAnnotation(Class<A> a, Class<?> c);
+
+	/**
+	 * Finds the specified declared annotation on the specified class.
+	 *
+	 * @param <A> The annotation type to find.
+	 * @param a The annotation type to find.
+	 * @param c The class to search on.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	<A extends Annotation> A getDeclaredAnnotation(Class<A> a, Class<?> c);
+
+	/**
+	 * Finds the specified annotation on the specified method.
+	 *
+	 * @param <A> The annotation type to find.
+	 * @param a The annotation type to find.
+	 * @param m The method to search on.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	<A extends Annotation> A getAnnotation(Class<A> a, Method m);
+
+	/**
+	 * Finds the specified annotation on the specified field.
+	 *
+	 * @param <A> The annotation type to find.
+	 * @param a The annotation type to find.
+	 * @param f The field to search on.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	<A extends Annotation> A getAnnotation(Class<A> a, Field f);
+
+	/**
+	 * Finds the specified annotation on the specified constructor.
+	 *
+	 * @param <A> The annotation type to find.
+	 * @param a The annotation type to find.
+	 * @param c The constructor to search on.
+	 * @return The annotation, or <jk>null</jk> if not found.
+	 */
+	<A extends Annotation> A getAnnotation(Class<A> a, Constructor<?> c);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
index 2dca01b..a640212 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param csvMetaProvider CSV metadata provider (for finding information about other artifacts).

+	 * @param mp CSV metadata provider (for finding information about other artifacts).

 	 */

-	public CsvBeanPropertyMeta(BeanPropertyMeta bpm, CsvMetaProvider csvMetaProvider) {

+	public CsvBeanPropertyMeta(BeanPropertyMeta bpm, CsvMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
index ebbcdee..279a500 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param csvMetaProvider CSV metadata provider (for finding information about other artifacts).

+	 * @param mp CSV metadata provider (for finding information about other artifacts).

 	 */

-	public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider csvMetaProvider) {

+	public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider mp) {

 		super(cm);

-		this.csv = cm.getInfo().getAnnotation(Csv.class);

+		this.csv = mp.getAnnotation(Csv.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
index 5fea34b..b6f142c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
@@ -38,17 +38,18 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param htmlMetaProvider HTML metadata provider (for finding information about other artifacts).

+	 * @param mp HTML metadata provider (for finding information about other artifacts).

 	 */

-	public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, HtmlMetaProvider htmlMetaProvider) {

+	public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, HtmlMetaProvider mp) {

 		super(bpm);

+

 		Builder b = new Builder();

 		if (bpm.getInnerField() != null)

-			b.findHtmlInfo(bpm.getInnerField().getAnnotation(Html.class));

+			b.findHtmlInfo(mp.getAnnotation(Html.class, bpm.getInnerField()));

 		if (bpm.getGetter() != null)

-			b.findHtmlInfo(bpm.getGetter().getAnnotation(Html.class));

+			b.findHtmlInfo(mp.getAnnotation(Html.class, bpm.getGetter()));

 		if (bpm.getSetter() != null)

-			b.findHtmlInfo(bpm.getSetter().getAnnotation(Html.class));

+			b.findHtmlInfo(mp.getAnnotation(Html.class, bpm.getSetter()));

 

 		this.format = b.format;

 		this.noTables = b.noTables;

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
index 86890b7..5f9ce95 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
@@ -32,11 +32,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param htmlMetaProvider HTML metadata provider (for finding information about other artifacts).

+	 * @param mp HTML metadata provider (for finding information about other artifacts).

 	 */

-	public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider htmlMetaProvider) {

+	public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider mp) {

 		super(cm);

-		this.html = cm.getInfo().getAnnotation(Html.class);

+		this.html = mp.getAnnotation(Html.class, cm.getInnerClass());

 		if (html != null) {

 			format = html.format();

 			noTables = html.noTables();

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
index 006338e..1324dcf 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param jsoMetaProvider JSO metadata provider (for finding information about other artifacts).

+	 * @param mp JSO metadata provider (for finding information about other artifacts).

 	 */

-	public JsoBeanPropertyMeta(BeanPropertyMeta bpm, JsoMetaProvider jsoMetaProvider) {

+	public JsoBeanPropertyMeta(BeanPropertyMeta bpm, JsoMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
index 0d984d5..7227a2b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param jsoMetaProvider JSO metadata provider (for finding information about other artifacts).

+	 * @param mp JSO metadata provider (for finding information about other artifacts).

 	 */

-	public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider jsoMetaProvider) {

+	public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider mp) {

 		super(cm);

-		this.jso = cm.getInfo().getAnnotation(Jso.class);

+		this.jso = mp.getAnnotation(Jso.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
index 5237126..42e8d4c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param jsonMetaProvider JSON metadata provider (for finding information about other artifacts).

+	 * @param mp JSON metadata provider (for finding information about other artifacts).

 	 */

-	public JsonBeanPropertyMeta(BeanPropertyMeta bpm, JsonMetaProvider jsonMetaProvider) {

+	public JsonBeanPropertyMeta(BeanPropertyMeta bpm, JsonMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
index 11d6aa2..0179b62 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
@@ -30,11 +30,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param jsonMetaProvider JSON metadata provider (for finding information about other artifacts).

+	 * @param mp JSON metadata provider (for finding information about other artifacts).

 	 */

-	public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider jsonMetaProvider) {

+	public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider mp) {

 		super(cm);

-		this.json = cm.getInfo().getAnnotation(Json.class);

+		this.json = mp.getAnnotation(Json.class, cm.getInnerClass());

 		if (json != null) {

 			wrapperAttr = nullIfEmpty(json.wrapperAttr());

 		} else {

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
index b3ebb91..6a2de0a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
@@ -35,9 +35,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param jsonSchemaMetaProvider JSON-schema metadata provider (for finding information about other artifacts).

+	 * @param mp JSON-schema metadata provider (for finding information about other artifacts).

 	 */

-	public JsonSchemaBeanPropertyMeta(BeanPropertyMeta bpm, JsonSchemaMetaProvider jsonSchemaMetaProvider) {

+	public JsonSchemaBeanPropertyMeta(BeanPropertyMeta bpm, JsonSchemaMetaProvider mp) {

 		super(bpm);

 

 		this.schema = new ObjectMap();

@@ -47,11 +47,11 @@
 

 		try {

 			if (field != null)

-				schema.appendAll(SchemaUtils.asMap(field.getAnnotation(Schema.class)));

+				schema.appendAll(SchemaUtils.asMap(mp.getAnnotation(Schema.class, field)));

 			if (getter != null)

-				schema.appendAll(SchemaUtils.asMap(getter.getAnnotation(Schema.class)));

+				schema.appendAll(SchemaUtils.asMap(mp.getAnnotation(Schema.class, getter)));

 			if (setter != null)

-				schema.appendAll(SchemaUtils.asMap(setter.getAnnotation(Schema.class)));

+				schema.appendAll(SchemaUtils.asMap(mp.getAnnotation(Schema.class, setter)));

 		} catch (ParseException e) {

 			throw new RuntimeException(e);

 		}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
index 2f7b9c8..8caa931 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
@@ -28,12 +28,12 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param jsonSchemaMetaProvider JSON-schema metadata provider (for finding information about other artifacts).

+	 * @param mp JSON-schema metadata provider (for finding information about other artifacts).

 	 */

-	public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider jsonSchemaMetaProvider) {

+	public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider mp) {

 		super(cm);

 		try {

-			Schema s = cm.getInfo().getAnnotation(Schema.class);

+			Schema s = mp.getAnnotation(Schema.class, cm.getInnerClass());

 			schema = s == null ? ObjectMap.EMPTY_MAP : SchemaUtils.asMap(s);

 		} catch (ParseException e) {

 			throw new RuntimeException(e);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
deleted file mode 100644
index 37db694..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// ***************************************************************************************************************************

-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *

-// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *

-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *

-// * with the License.  You may obtain a copy of the License at                                                              *

-// *                                                                                                                         *

-// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *

-// *                                                                                                                         *

-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *

-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *

-// * specific language governing permissions and limitations under the License.                                              *

-// ***************************************************************************************************************************

-package org.apache.juneau.jsonschema.annotation;

-

-import static java.lang.annotation.ElementType.*;

-import static java.lang.annotation.RetentionPolicy.*;

-

-import java.lang.annotation.*;

-

-import org.apache.juneau.jsonschema.*;

-

-/**

- * Annotation that can be applied to classes, fields, and methods to tweak how they are handled by {@link JsonSchemaGenerator}.

- *

- * <ul class='seealso'>

- * </ul>

- */

-@Documented

-@Target({TYPE,FIELD,METHOD})

-@Retention(RUNTIME)

-@Inherited

-public @interface JsonSchema {

-

-	/**

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

-	 *

-	 * <p>

-	 * Used in conjunction with the {@link JsonSchemaConfig#annotateJsonSchema()}.

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

-	 *

-	 * 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 "";

-}

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
index 4e10a24..6877c2d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
@@ -171,17 +171,17 @@
 	String allowNestedExamples() default "";
 
 	/**
-	 * Indirectly applies {@link JsonSchema @JsonSchema} annotations to classes/methods.
+	 * Indirectly applies {@link Schema @Schema} annotations to classes/methods.
 	 *
 	 * <p>
-	 * Provides an alternate approach for applying annotations to classes/methods annotations using the {@link JsonSchema#on() @JsonSchema.on}
+	 * Provides an alternate approach for applying annotations to classes/methods annotations using the {@link Schema#on() @Schema.on}
 	 * annotation to specify the class/method names to apply the annotation to.
 	 *
 	 * <ul class='seealso'>
 	 * 	<li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
 	 * </ul>
 	 */
-	JsonSchema[] annotateJsonSchema() default {};
+	Schema[] annotateSchema() default {};
 
 	/**
 	 * Configuration property:  Bean schema definition mapper.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java
index 20db787..64949c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java
@@ -55,7 +55,7 @@
 		if (! a.useBeanDefs().isEmpty())
 			psb.set(JSONSCHEMA_useBeanDefs, bool(a.useBeanDefs()));
 
-		if (a.annotateJsonSchema().length > 0)
-			psb.addTo(CONTEXT_annotations, a.annotateJsonSchema());
+		if (a.annotateSchema().length > 0)
+			psb.addTo(CONTEXT_annotations, a.annotateSchema());
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
index e5944f8..9afcbda 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
@@ -719,4 +719,26 @@
 	 * </ul>

 	 */

 	String[] value() default {};

+

+	/**

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

+	 *

+	 * <p>

+	 * Used in conjunction with the {@link JsonSchemaConfig#annotateSchema()}.

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

+	 *

+	 * 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 "";

 }

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
index 84782af..eea4d56 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param msgPackMetaProvider MessagePack metadata provider (for finding information about other artifacts).

+	 * @param mp MessagePack metadata provider (for finding information about other artifacts).

 	 */

-	public MsgPackBeanPropertyMeta(BeanPropertyMeta bpm, MsgPackMetaProvider msgPackMetaProvider) {

+	public MsgPackBeanPropertyMeta(BeanPropertyMeta bpm, MsgPackMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
index 7298470..88b0f86 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param msgPackMetaProvider MessagePack metadata provider (for finding information about other artifacts).

+	 * @param mp MessagePack metadata provider (for finding information about other artifacts).

 	 */

-	public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider msgPackMetaProvider) {

+	public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider mp) {

 		super(cm);

-		this.msgPack = cm.getInfo().getAnnotation(MsgPack.class);

+		this.msgPack = mp.getAnnotation(MsgPack.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
index 416e081..3c35430 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param openApiMetaProvider OpenApi metadata provider (for finding information about other artifacts).

+	 * @param mp OpenApi metadata provider (for finding information about other artifacts).

 	 */

-	public OpenApiBeanPropertyMeta(BeanPropertyMeta bpm, OpenApiMetaProvider openApiMetaProvider) {

+	public OpenApiBeanPropertyMeta(BeanPropertyMeta bpm, OpenApiMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
index e65596b..f786453 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param openApiMetaProvider OpenApi metadata provider (for finding information about other artifacts).

+	 * @param mp OpenApi metadata provider (for finding information about other artifacts).

 	 */

-	public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider openApiMetaProvider) {

+	public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider mp) {

 		super(cm);

-		this.openApi = cm.getInfo().getAnnotation(OpenApi.class);

+		this.openApi = mp.getAnnotation(OpenApi.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
index 812c67f..7267d8d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param plainTextMetaProvider PlainText metadata provider (for finding information about other artifacts).

+	 * @param mp PlainText metadata provider (for finding information about other artifacts).

 	 */

-	public PlainTextBeanPropertyMeta(BeanPropertyMeta bpm, PlainTextMetaProvider plainTextMetaProvider) {

+	public PlainTextBeanPropertyMeta(BeanPropertyMeta bpm, PlainTextMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
index 6c51b02..11234e3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param plainTextMetaProvider PlainText metadata provider (for finding information about other artifacts).

+	 * @param mp PlainText metadata provider (for finding information about other artifacts).

 	 */

-	public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider plainTextMetaProvider) {

+	public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider mp) {

 		super(cm);

-		this.plainText = cm.getInfo().getAnnotation(PlainText.class);

+		this.plainText = mp.getAnnotation(PlainText.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index 55c8a15..b7e0963 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -1028,6 +1028,19 @@
 	}
 
 	/**
+	 * Returns all annotations of the specified type defined on the specified class or parent classes/interfaces.
+	 *
+	 * @param <T> The annotation to search for.
+	 * @param a The annotation to search for.
+	 * @param mp The metadata provider for finding annotations.
+	 * @return
+	 * 	A list of all matching annotations found in child-to-parent order, or an empty list if none found.
+	 */
+	public <T extends Annotation> List<T> getAnnotations(Class<T> a, MetaProvider mp) {
+		return appendAnnotations(new ArrayList<>(), a, mp);
+	}
+
+	/**
 	 * Identical to {@link #getAnnotations(Class)} but optionally returns the list in reverse (parent-to-child) order.
 	 *
 	 * @param a
@@ -1127,10 +1140,33 @@
 	 * @return The same list.
 	 */
 	public <T extends Annotation> List<T> appendAnnotations(List<T> l, Class<T> a) {
+		return appendAnnotations(l, a, MetaProvider.DEFAULT);
+	}
+
+	/**
+	 * Finds and appends the specified annotation on the specified class and superclasses/interfaces to the specified
+	 * list.
+	 *
+	 * <p>
+	 * Annotations are appended in the following orders:
+	 * <ol>
+	 * 	<li>On this class.
+	 * 	<li>On parent classes ordered child-to-parent.
+	 * 	<li>On interfaces ordered child-to-parent.
+	 * 	<li>On the package of this class.
+	 * </ol>
+	 *
+	 * @param <T> The annotation to search for.
+	 * @param l The list of annotations.
+	 * @param a The annotation to search for.
+	 * @param mp The metadata provider for finding annotations on classes and methods.
+	 * @return The same list.
+	 */
+	public <T extends Annotation> List<T> appendAnnotations(List<T> l, Class<T> a, MetaProvider mp) {
 		for (ClassInfo ci : getParents())
-			addIfNotNull(l, ci.getDeclaredAnnotation(a));
+			addIfNotNull(l, mp.getDeclaredAnnotation(a, ci.inner()));
 		for (ClassInfo ci : getInterfaces())
-			addIfNotNull(l, ci.getDeclaredAnnotation(a));
+			addIfNotNull(l, mp.getDeclaredAnnotation(a, ci.inner()));
 		addIfNotNull(l, getPackageAnnotation(a));
 		return l;
 	}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
index 776c7b9..61b478c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param soapXmlMetaProvider SOAP/XML metadata provider (for finding information about other artifacts).

+	 * @param mp SOAP/XML metadata provider (for finding information about other artifacts).

 	 */

-	public SoapXmlBeanPropertyMeta(BeanPropertyMeta bpm, SoapXmlMetaProvider soapXmlMetaProvider) {

+	public SoapXmlBeanPropertyMeta(BeanPropertyMeta bpm, SoapXmlMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
index 3c47da9..0d38b50 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param soapXmlMetaProvider SOAP/XML metadata provider (for finding information about other artifacts).

+	 * @param mp SOAP/XML metadata provider (for finding information about other artifacts).

 	 */

-	public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider soapXmlMetaProvider) {

+	public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider mp) {

 		super(cm);

-		this.soapXml = cm.getInfo().getAnnotation(SoapXml.class);

+		this.soapXml = mp.getAnnotation(SoapXml.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
index f07afb9..4693650 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param uonMetaProvider UON metadata provider (for finding information about other artifacts).

+	 * @param mp UON metadata provider (for finding information about other artifacts).

 	 */

-	public UonBeanPropertyMeta(BeanPropertyMeta bpm, UonMetaProvider uonMetaProvider) {

+	public UonBeanPropertyMeta(BeanPropertyMeta bpm, UonMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
index 9ee9da7..48267b6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param uonMetaProvider Uon metadata provider (for finding information about other artifacts).

+	 * @param mp Uon metadata provider (for finding information about other artifacts).

 	 */

-	public UonClassMeta(ClassMeta<?> cm, UonMetaProvider uonMetaProvider) {

+	public UonClassMeta(ClassMeta<?> cm, UonMetaProvider mp) {

 		super(cm);

-		this.uon = cm.getInfo().getAnnotation(Uon.class);

+		this.uon = mp.getAnnotation(Uon.class, cm.getInnerClass());

 	}

 

 	/**

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
index 324dbd6..b5de5d4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
@@ -30,9 +30,9 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param urlEncodingMetaProvider URL-Encoding metadata provider (for finding information about other artifacts).

+	 * @param mp URL-Encoding metadata provider (for finding information about other artifacts).

 	 */

-	public UrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm, UrlEncodingMetaProvider urlEncodingMetaProvider) {

+	public UrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm, UrlEncodingMetaProvider mp) {

 		super(bpm);

 	}

 

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
index 0b4de2d..aeefe69 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
@@ -27,11 +27,11 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param urlEncodingMetaProvider URL-encoding metadata provider (for finding information about other artifacts).

+	 * @param mp URL-encoding metadata provider (for finding information about other artifacts).

 	 */

-	public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider urlEncodingMetaProvider) {

+	public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider mp) {

 		super(cm);

-		this.urlEncoding = cm.getInfo().getAnnotation(UrlEncoding.class);

+		this.urlEncoding = mp.getAnnotation(UrlEncoding.class, cm.getInnerClass());

 		if (urlEncoding != null) {

 			expandedParams = urlEncoding.expandedParams();

 		} else {

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 d6602d3..7031e12 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
@@ -26,7 +26,8 @@
 public class ReflectionMap<V> {
 
 	private final List<ClassEntry<V>> classEntries;
-	private final List<MethodEntry<V>> methodEntries;
+	private final List<MemberEntry<V>> memberEntries;
+	private final boolean noClassEntries, noMemberEntries;
 
 	/**
 	 * Constructor.
@@ -35,7 +36,9 @@
 	 */
 	ReflectionMap(Builder<V> b) {
 		this.classEntries = Collections.unmodifiableList(new ArrayList<>(b.classEntries));
-		this.methodEntries = Collections.unmodifiableList(new ArrayList<>(b.methodEntries));
+		this.memberEntries = Collections.unmodifiableList(new ArrayList<>(b.memberEntries));
+		this.noClassEntries = classEntries.isEmpty();
+		this.noMemberEntries = memberEntries.isEmpty();
 	}
 
 	/**
@@ -56,7 +59,7 @@
 	 */
 	public static class Builder<V> {
 		List<ClassEntry<V>> classEntries = new ArrayList<>();
-		List<MethodEntry<V>> methodEntries = new ArrayList<>();
+		List<MemberEntry<V>> memberEntries = new ArrayList<>();
 
 		/**
 		 * Adds a mapping to this builder.
@@ -88,7 +91,7 @@
 					if (Character.isUpperCase(s2.charAt(0))) {
 						classEntries.add(new ClassEntry<>(s, value));
 					} else {
-						methodEntries.add(new MethodEntry<>(s1, s2, value));
+						memberEntries.add(new MemberEntry<>(s1, s2, value));
 					}
 				}
 			}
@@ -113,7 +116,7 @@
 	 * @return All matching objects.  Never <jk>null</jk>.
 	 */
 	public List<V> find(Class<?> c) {
-		return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).collect(Collectors.toList());
+		return noClassEntries ? Collections.emptyList() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).collect(Collectors.toList());
 	}
 
 	/**
@@ -123,7 +126,7 @@
 	 * @return The matching object.  Never <jk>null</jk>.
 	 */
 	public Optional<V> findFirst(Class<?> c) {
-		return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).findFirst();
+		return noClassEntries ? Optional.empty() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).findFirst();
 	}
 
 	/**
@@ -134,7 +137,7 @@
 	 * @return All matching objects.  Never <jk>null</jk>.
 	 */
 	public List<V> find(Class<?> c, Class<? extends V> ofType) {
-		return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
+		return noClassEntries ? Collections.emptyList() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
 	}
 
 	/**
@@ -145,7 +148,7 @@
 	 * @return The matching object.  Never <jk>null</jk>.
 	 */
 	public Optional<V> findFirst(Class<?> c, Class<? extends V> ofType) {
-		return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
+		return noClassEntries ? Optional.empty() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
 	}
 
 	/**
@@ -154,8 +157,8 @@
 	 * @param m The method to test for.
 	 * @return All matching objects.  Never <jk>null</jk>.
 	 */
-	public List<V> find(Method m) {
-		return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).collect(Collectors.toList());
+	public List<V> find(Member m) {
+		return noMemberEntries ? Collections.emptyList() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).collect(Collectors.toList());
 	}
 
 	/**
@@ -164,8 +167,8 @@
 	 * @param m The method to test for.
 	 * @return The matching object.  Never <jk>null</jk>.
 	 */
-	public Optional<V> findFirst(Method m) {
-		return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).findFirst();
+	public Optional<V> findFirst(Member m) {
+		return noMemberEntries ? Optional.empty() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).findFirst();
 	}
 
 	/**
@@ -175,8 +178,8 @@
 	 * @param ofType Only return objects of the specified type.
 	 * @return All matching objects.  Never <jk>null</jk>.
 	 */
-	public List<V> find(Method m, Class<? extends V> ofType) {
-		return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
+	public List<V> find(Member m, Class<? extends V> ofType) {
+		return noMemberEntries ? Collections.emptyList() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
 	}
 
 	/**
@@ -186,8 +189,8 @@
 	 * @param ofType Only return objects of the specified type.
 	 * @return The matching object.  Never <jk>null</jk>.
 	 */
-	public Optional<V> findFirst(Method m, Class<? extends V> ofType) {
-		return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
+	public Optional<V> findFirst(Member m, Class<? extends V> ofType) {
+		return noMemberEntries ? Optional.empty() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
 	}
 
 	static class ClassEntry<V> {
@@ -204,17 +207,17 @@
 		}
 	}
 
-	static class MethodEntry<V> {
+	static class MemberEntry<V> {
 		String className, methodName;
 		V value;
 
-		MethodEntry(String className, String methodName, V value) {
+		MemberEntry(String className, String methodName, V value) {
 			this.className = className;
 			this.methodName = methodName;
 			this.value = value;
 		}
 
-		public boolean matches(Method m) {
+		public boolean matches(Member m) {
 			if (m == null)
 				return false;
 			Class<?> c = m.getDeclaringClass();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
index 9924b2e..e92da24 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
@@ -38,13 +38,13 @@
 	 * Constructor.

 	 *

 	 * @param beanMeta The metadata on the bean that this metadata applies to.

-	 * @param xmlMetaProvider XML metadata provider (for finding information about other artifacts).

+	 * @param mp XML metadata provider (for finding information about other artifacts).

 	 */

-	public XmlBeanMeta(BeanMeta<?> beanMeta, XmlMetaProvider xmlMetaProvider) {

+	public XmlBeanMeta(BeanMeta<?> beanMeta, XmlMetaProvider mp) {

 		super(beanMeta);

 

 		Class<?> c = beanMeta.getClassMeta().getInnerClass();

-		XmlBeanMetaBuilder b = new XmlBeanMetaBuilder(beanMeta, xmlMetaProvider);

+		XmlBeanMetaBuilder b = new XmlBeanMetaBuilder(beanMeta, mp);

 

 		attrs = unmodifiableMap(b.attrs);

 		elements = unmodifiableMap(b.elements);

@@ -77,9 +77,9 @@
 			contentProperty;

 		XmlFormat contentFormat = DEFAULT;

 

-		XmlBeanMetaBuilder(BeanMeta<?> beanMeta, XmlMetaProvider xmlMetaProvider) {

+		XmlBeanMetaBuilder(BeanMeta<?> beanMeta, XmlMetaProvider mp) {

 			Class<?> c = beanMeta.getClassMeta().getInnerClass();

-			Xml xml = c.getAnnotation(Xml.class);

+			Xml xml = mp.getAnnotation(Xml.class, c);

 			XmlFormat defaultFormat = null;

 

 			if (xml != null) {

@@ -97,7 +97,7 @@
 			}

 

 			for (BeanPropertyMeta p : beanMeta.getPropertyMetas()) {

-				XmlFormat xf = xmlMetaProvider.getXmlBeanPropertyMeta(p).getXmlFormat();

+				XmlFormat xf = mp.getXmlBeanPropertyMeta(p).getXmlFormat();

 				ClassMeta<?> pcm = p.getClassMeta();

 				if (xf == ATTR) {

 					attrs.put(p.getName(), p);

@@ -128,7 +128,7 @@
 					contentFormat = xf;

 				}

 				// Look for any properties that are collections with @Xml.childName specified.

-				String n = xmlMetaProvider.getXmlBeanPropertyMeta(p).getChildName();

+				String n = mp.getXmlBeanPropertyMeta(p).getChildName();

 				if (n != null) {

 					if (collapsedProperties.containsKey(n) && collapsedProperties.get(n) != p)

 						throw new BeanRuntimeException(c, "Multiple properties found with the child name ''{0}''.", n);

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
index 1a979c4..87185bc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
@@ -37,21 +37,21 @@
 	 * Constructor.

 	 *

 	 * @param bpm The metadata of the bean property of this additional metadata.

-	 * @param xmlMetaProvider XML metadata provider (for finding information about other artifacts).

+	 * @param mp XML metadata provider (for finding information about other artifacts).

 	 */

-	public XmlBeanPropertyMeta(BeanPropertyMeta bpm, XmlMetaProvider xmlMetaProvider) {

+	public XmlBeanPropertyMeta(BeanPropertyMeta bpm, XmlMetaProvider mp) {

 		super(bpm);

-		this.xmlMetaProvider = xmlMetaProvider;

+		this.xmlMetaProvider = mp;

 

 		if (bpm.getInnerField() != null)

-			findXmlInfo(bpm.getInnerField().getAnnotation(Xml.class));

+			findXmlInfo(mp.getAnnotation(Xml.class, bpm.getInnerField()), mp);

 		if (bpm.getGetter() != null)

-			findXmlInfo(bpm.getGetter().getAnnotation(Xml.class));

+			findXmlInfo(mp.getAnnotation(Xml.class, bpm.getGetter()), mp);

 		if (bpm.getSetter() != null)

-			findXmlInfo(bpm.getSetter().getAnnotation(Xml.class));

+			findXmlInfo(mp.getAnnotation(Xml.class, bpm.getSetter()), mp);

 

 		if (namespace == null)

-			namespace = xmlMetaProvider.getXmlClassMeta(bpm.getBeanMeta().getClassMeta()).getNamespace();

+			namespace = mp.getXmlClassMeta(bpm.getBeanMeta().getClassMeta()).getNamespace();

 	}

 

 	private XmlBeanPropertyMeta() {

@@ -100,7 +100,7 @@
 		return childName;

 	}

 

-	private void findXmlInfo(Xml xml) {

+	private void findXmlInfo(Xml xml, MetaProvider mp) {

 		if (xml == null)

 			return;

 		BeanPropertyMeta bpm = getBeanPropertyMeta();

@@ -108,8 +108,8 @@
 		ClassMeta<?> cmBean = bpm.getBeanMeta().getClassMeta();

 		String name = bpm.getName();

 

-		List<Xml> xmls = bpm.findAnnotations(Xml.class);

-		List<XmlSchema> schemas = bpm.findAnnotations(XmlSchema.class);

+		List<Xml> xmls = bpm.findAnnotations(Xml.class, mp);

+		List<XmlSchema> schemas = bpm.findAnnotations(XmlSchema.class, mp);

 		namespace = XmlUtils.findNamespace(xmls, schemas);

 

 		if (xmlFormat == XmlFormat.DEFAULT)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
index 3d111ee..9cf999d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
@@ -35,12 +35,12 @@
 	 * Constructor.

 	 *

 	 * @param cm The class that this annotation is defined on.

-	 * @param xmlMetaProvider XML metadata provider (for finding information about other artifacts).

+	 * @param mp XML metadata provider (for finding information about other artifacts).

 	 */

-	public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider xmlMetaProvider) {

+	public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider mp) {

 		super(cm);

-		this.namespace = findNamespace(cm);

-		this.xml = cm.getInfo().getAnnotation(Xml.class);

+		this.namespace = findNamespace(cm, mp);

+		this.xml = mp.getAnnotation(Xml.class, cm.getInnerClass());

 		if (xml != null) {

 			this.format = xml.format();

 			this.childName = nullIfEmpty(xml.childName());

@@ -99,12 +99,12 @@
 		return namespace;

 	}

 

-	private static Namespace findNamespace(ClassMeta<?> cm) {

+	private static Namespace findNamespace(ClassMeta<?> cm, MetaProvider mp) {

 		if (cm == null)

 			return null;

 		ClassInfo ci = cm.getInfo();

-		List<Xml> xmls = ci.getAnnotations(Xml.class);

-		List<XmlSchema> schemas = ci.getAnnotations(XmlSchema.class);

+		List<Xml> xmls = ci.getAnnotations(Xml.class, mp);

+		List<XmlSchema> schemas = ci.getAnnotations(XmlSchema.class, mp);

 		return XmlUtils.findNamespace(xmls, schemas);

 	}

 }