JUNEAU-168 Serializer/Parser handling of proxy beans.
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanContextTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanContextTest.java
new file mode 100644
index 0000000..7202d7e
--- /dev/null
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/BeanContextTest.java
@@ -0,0 +1,53 @@
+// ***************************************************************************************************************************

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

+

+import static org.junit.Assert.*;

+

+import org.junit.*;

+

+@SuppressWarnings({"rawtypes"})

+public class BeanContextTest {

+

+	BeanContext bc = BeanContext.DEFAULT;

+

+	public static interface A1 {

+		public int getF1();

+		public void setF1(int f1);

+	}

+

+	@Test

+	public void normalCachableBean() throws ExecutableException {

+		ClassMeta cm1 = bc.getClassMeta(A1.class), cm2 = bc.getClassMeta(A1.class);

+		assertTrue(cm1 == cm2);

+	}

+

+	interface A2 {

+		void foo(int x);

+	}

+

+	@Test

+	public void lambdaExpressionsNotCached() throws ExecutableException {

+		BeanContext bc = BeanContext.DEFAULT;

+		A2 fi = (x) -> System.out.println(x);

+		ClassMeta cm1 = bc.getClassMeta(fi.getClass()), cm2 = bc.getClassMeta(fi.getClass());

+		assertTrue(cm1 != cm2);

+	}

+

+	@Test

+	public void proxiesNotCached() throws ExecutableException {

+		A1 a1 = bc.createBeanSession().getBeanMeta(A1.class).newBean(null);

+		ClassMeta cm1 = bc.getClassMeta(a1.getClass()), cm2 = bc.getClassMeta(a1.getClass());

+		assertTrue(cm1 != cm2);

+	}

+}
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 385b703..fe532b0 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -149,7 +149,7 @@
 		wLock.lock();

 		try {

 			// We always immediately add this class meta to the bean context cache so that we can resolve recursive references.

-			if (beanContext != null && beanContext.cmCache != null)

+			if (beanContext != null && beanContext.cmCache != null && isCacheable(innerClass))

 				beanContext.cmCache.put(innerClass, this);

 

 			ClassMetaBuilder<T> builder = new ClassMetaBuilder(innerClass, beanContext, implClass, beanFilter, pojoSwaps, childPojoSwaps, example);

@@ -197,6 +197,19 @@
 	}

 

 	/**

+	 * Generated classes shouldn't be cacheable to prevent needlessly filling up the cache.

+	 */

+	private static boolean isCacheable(Class<?> c) {

+		String n = c.getName();

+		char x = n.charAt(n.length()-1);  // All generated classes appear to end with digits.

+		if (x >= '0' && x <= '9') {

+			if (n.indexOf("$$") != -1 || n.startsWith("sun") || n.startsWith("com.sun") || n.indexOf("$Proxy") != -1)

+				return false;

+		}

+		return true;

+	}

+

+	/**

 	 * Causes thread to wait until constructor has exited.

 	 */

 	final void waitForInit() {