DELTASPIKE-823 support stacked proxy classes in ProxyUtils Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/a1031ed4 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/a1031ed4 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/a1031ed4
Branch: refs/heads/master Commit: a1031ed47cf68ccb20162864e649faffdb8ea7ce Parents: efb2c0d Author: Thomas Andraschko <tandrasc...@apache.org> Authored: Sat Feb 14 11:00:41 2015 +0100 Committer: Thomas Andraschko <tandrasc...@apache.org> Committed: Sat Feb 14 11:00:41 2015 +0100 ---------------------------------------------------------------------- .../apache/deltaspike/core/util/ProxyUtils.java | 39 +++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/a1031ed4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ProxyUtils.java ---------------------------------------------------------------------- diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ProxyUtils.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ProxyUtils.java index 1deb060..03e9f06 100644 --- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ProxyUtils.java +++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/util/ProxyUtils.java @@ -41,11 +41,14 @@ public abstract class ProxyUtils */ public static Class getUnproxiedClass(Class currentClass) { - if (isProxiedClass(currentClass)) + Class unproxiedClass = currentClass; + + while (isProxiedClass(unproxiedClass)) { - return currentClass.getSuperclass(); + unproxiedClass = unproxiedClass.getSuperclass(); } - return currentClass; + + return unproxiedClass; } /** @@ -68,13 +71,21 @@ public abstract class ProxyUtils { List<Class<?>> result = new ArrayList<Class<?>>(); result.add(proxyClass); + if (isInterfaceProxy(proxyClass)) { result.addAll(Arrays.asList(proxyClass.getInterfaces())); } else { - result.add(proxyClass.getSuperclass()); + Class unproxiedClass = proxyClass.getSuperclass(); + result.add(unproxiedClass); + + while (isProxiedClass(unproxiedClass)) + { + unproxiedClass = unproxiedClass.getSuperclass(); + result.add(unproxiedClass); + } } return result; } @@ -82,7 +93,23 @@ public abstract class ProxyUtils public static boolean isInterfaceProxy(Class<?> proxyClass) { Class<?>[] interfaces = proxyClass.getInterfaces(); - return Proxy.class.equals(proxyClass.getSuperclass()) && - interfaces != null && interfaces.length > 0; + if (Proxy.class.equals(proxyClass.getSuperclass()) && + interfaces != null && interfaces.length > 0) + { + return true; + } + + if (proxyClass.getName().contains("$$")) + { + for (Class<?> iface : interfaces) + { + if (proxyClass.getName().startsWith(iface.getName())) + { + return true; + } + } + } + + return false; } }