in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java [654:756]
static final List<BeanMethod> findBeanMethods(BeanContext ctx, Class<?> c, Class<?> stopClass, Visibility v, PropertyNamer pn, boolean fluentSetters) {
List<BeanMethod> l = new LinkedList<>();
forEachClass(ClassInfo.of(c), stopClass, c2 -> {
for (MethodInfo m : c2.getDeclaredMethods()) {
if (m.isStatic() || m.isBridge() || m.getParamCount() > 2 || m.hasAnnotation(ctx, BeanIgnore.class))
continue;
Transient t = m.getAnnotation(ctx, Transient.class);
if (t != null && t.value())
continue;
List<Beanp> lp = list();
List<Name> ln = list();
ctx.forEachAnnotation(Beanp.class, m.inner(), x -> true, x -> lp.add(x));
ctx.forEachAnnotation(Name.class, m.inner(), x -> true, x -> ln.add(x));
if (! (m.isVisible(v) || lp.size() > 0 || ln.size() > 0))
continue;
String n = m.getSimpleName();
List<ClassInfo> pt = m.getParamTypes();
ClassInfo rt = m.getReturnType();
MethodType methodType = UNKNOWN;
String bpName = bpName(lp, ln);
if (pt.isEmpty()) {
if ("*".equals(bpName)) {
if (rt.isChildOf(Collection.class)) {
methodType = EXTRAKEYS;
} else if (rt.isChildOf(Map.class)) {
methodType = GETTER;
}
n = bpName;
} else if (n.startsWith("get") && (! rt.is(Void.TYPE))) {
methodType = GETTER;
n = n.substring(3);
} else if (n.startsWith("is") && (rt.is(Boolean.TYPE) || rt.is(Boolean.class))) {
methodType = GETTER;
n = n.substring(2);
} else if (bpName != null) {
methodType = GETTER;
if (bpName.isEmpty()) {
if (n.startsWith("get"))
n = n.substring(3);
else if (n.startsWith("is"))
n = n.substring(2);
bpName = n;
} else {
n = bpName;
}
}
} else if (pt.size() == 1) {
if ("*".equals(bpName)) {
if (pt.get(0).isChildOf(Map.class)) {
methodType = SETTER;
n = bpName;
} else if (pt.get(0).is(String.class)) {
methodType = GETTER;
n = bpName;
}
} else if (n.startsWith("set") && (rt.isParentOf(c) || rt.is(Void.TYPE))) {
methodType = SETTER;
n = n.substring(3);
} else if (n.startsWith("with") && (rt.isParentOf(c))) {
methodType = SETTER;
n = n.substring(4);
} else if (bpName != null) {
methodType = SETTER;
if (bpName.isEmpty()) {
if (n.startsWith("set"))
n = n.substring(3);
bpName = n;
} else {
n = bpName;
}
} else if (fluentSetters && rt.isParentOf(c)) {
methodType = SETTER;
}
} else if (pt.size() == 2) {
if ("*".equals(bpName) && pt.get(0).is(String.class)) {
if (n.startsWith("set") && (rt.isParentOf(c) || rt.is(Void.TYPE))) {
methodType = SETTER;
} else {
methodType = GETTER;
}
n = bpName;
}
}
n = pn.getPropertyName(n);
if ("*".equals(bpName) && methodType == UNKNOWN)
throw new BeanRuntimeException(c, "Found @Beanp(\"*\") but could not determine method type on method ''{0}''.", m.getSimpleName());
if (methodType != UNKNOWN) {
if (bpName != null && ! bpName.isEmpty())
n = bpName;
if (n != null)
l.add(new BeanMethod(n, methodType, m.inner()));
}
}
});
return l;
}