package de.take_weiland.mods.commons.internal.prop; import com.google.common.reflect.TypeToken; import de.take_weiland.mods.commons.reflect.SCReflection; import org.apache.commons.lang3.StringUtils; import java.lang.invoke.MethodHandle; import java.lang.reflect.Method; import static java.lang.invoke.MethodHandles.publicLookup; /** * @author diesieben07 */ final class MethodProperty<T> extends AbstractProperty<T, Method> { MethodProperty(Method member) { super(member); } @Override MethodHandle resolveGetter() throws IllegalAccessException { return publicLookup().unreflect(member); } @Override MethodHandle resolveSetter() throws IllegalAccessException { Method setter = SCReflection.findSetter(member); if (setter == null) { return null; } else { setter.setAccessible(true); return publicLookup().unreflect(setter); } } @Override TypeToken<?> resolveType() { return TypeToken.of(member.getGenericReturnType()); } @Override public String getName() { String name = member.getName(); if (name.startsWith("get") && name.length() > 3 && Character.isUpperCase(name.charAt(3))) { return StringUtils.uncapitalize(name.substring(3)); } else { return name; } } @SuppressWarnings("unchecked") @Override public Class<? super T> getRawType() { return (Class<? super T>) member.getReturnType(); } }