@Override public Object callBy(Map args) { return getReflected().callBy(args); }
@Override public List<KParameter> getParameters() { return getReflected().getParameters(); }
@Override public Object call(Object... args) { return getReflected().call(args); }
@Override public KType getReturnType() { return getReflected().getReturnType(); }
@Override public List<Annotation> getAnnotations() { return getReflected().getAnnotations(); }
@Override @SinceKotlin(version = "1.1") public boolean isAbstract() { return getReflected().isAbstract(); } }
@Override @SinceKotlin(version = "1.1") public List<KTypeParameter> getTypeParameters() { return getReflected().getTypeParameters(); }
@Override @SinceKotlin(version = "1.1") public boolean isFinal() { return getReflected().isFinal(); }
@Override @SinceKotlin(version = "1.1") public KVisibility getVisibility() { return getReflected().getVisibility(); }
@Override @SinceKotlin(version = "1.1") public boolean isOpen() { return getReflected().isOpen(); }
/** * Set a single property by calling {@code copy(…)} on a Kotlin data class. Copying creates a new instance that * holds all values of the original instance and the newly set {@link PersistentProperty} value. * * @see KCallable#callBy(Map) */ static <T> Object setProperty(PersistentProperty<?> property, T bean, @Nullable Object value) { Class<?> type = property.getOwner().getType(); KCallable<?> copy = COPY_METHOD_CACHE.computeIfAbsent(type, it -> getCopyMethod(it, property)); if (copy == null) { throw new UnsupportedOperationException(String.format( "Kotlin class %s has no .copy(…) method for property %s!", type.getName(), property.getName())); } return copy.callBy(getCallArgs(copy, property, bean, value)); }
private static <T> Map<KParameter, Object> getCallArgs(KCallable<?> callable, PersistentProperty<?> property, T bean, @Nullable Object value) { Map<KParameter, Object> args = new LinkedHashMap<>(2, 1); List<KParameter> parameters = callable.getParameters(); for (KParameter parameter : parameters) { if (parameter.getKind() == Kind.INSTANCE) { args.put(parameter, bean); } if (parameter.getKind() == Kind.VALUE && parameter.getName() != null && parameter.getName().equals(property.getName())) { args.put(parameter, value); } } return args; }