in deltaspike/modules/proxy/api/src/main/java/org/apache/deltaspike/proxy/api/DeltaSpikeProxyFactory.java [191:268]
protected ArrayList<Method> collectAllMethods(Class<?> clazz)
{
ArrayList<Method> methods = new ArrayList<>();
Set<Method> abstractMethodLeaves = new HashSet<>();
for (Method method : clazz.getMethods())
{
if (!ignoreMethod(method, methods))
{
methods.add(method);
if (Modifier.isAbstract(method.getModifiers()))
{
abstractMethodLeaves.add(method);
}
}
}
for (Method method : clazz.getDeclaredMethods())
{
if (!ignoreMethod(method, methods))
{
methods.add(method);
}
}
// collect methods from abstract super classes...
Class currentSuperClass = clazz.getSuperclass();
while (currentSuperClass != null)
{
if (Modifier.isAbstract(currentSuperClass.getModifiers()))
{
for (Method method : currentSuperClass.getDeclaredMethods())
{
if (!ignoreMethod(method, methods))
{
methods.add(method);
}
}
for (Method method : currentSuperClass.getMethods())
{
if (!ignoreMethod(method, methods))
{
methods.add(method);
}
}
}
currentSuperClass = currentSuperClass.getSuperclass();
}
// sort out somewhere implemented abstract methods
Class currentClass = clazz;
while (currentClass != null)
{
Iterator<Method> methodIterator = methods.iterator();
while (methodIterator.hasNext())
{
Method method = methodIterator.next();
if (Modifier.isAbstract(method.getModifiers()) && !abstractMethodLeaves.contains(method))
{
try
{
Method foundMethod = currentClass.getMethod(method.getName(), method.getParameterTypes());
// if method is implementent in the current class -> remove it
if (foundMethod != null && !Modifier.isAbstract(foundMethod.getModifiers()))
{
methodIterator.remove();
}
}
catch (Exception e)
{
// ignore...
}
}
}
currentClass = currentClass.getSuperclass();
}
return methods;
}