/** * {@inheritDoc} */ public MethodVisitor wrap(TypeDescription instrumentedType, MethodDescription instrumentedMethod, MethodVisitor methodVisitor, Implementation.Context implementationContext, TypePool typePool, int writerFlags, int readerFlags) { return instrumentedMethod.isAbstract() || instrumentedMethod.isNative() ? methodVisitor : doWrap(instrumentedType, instrumentedMethod, methodVisitor, implementationContext, writerFlags, readerFlags); }
&& !node.getSort().isMadeVisible() && methodDescription.isPublic() && !(methodDescription.isAbstract() || methodDescription.isFinal()) && methodDescription.getDeclaringType().isPackagePrivate()) {
@Override protected HashCodeMethod hashCodeMethod(TypeDescription instrumentedType) { TypeDefinition typeDefinition = instrumentedType.getSuperClass(); while (typeDefinition != null && !typeDefinition.represents(Object.class)) { if (typeDefinition.asErasure().getDeclaredAnnotations().isAnnotationPresent(Enhance.class)) { return HashCodeMethod.usingSuperClassOffset(); } MethodList<?> hashCode = typeDefinition.getDeclaredMethods().filter(isHashCode()); if (!hashCode.isEmpty()) { return hashCode.getOnly().isAbstract() ? HashCodeMethod.usingDefaultOffset() : HashCodeMethod.usingSuperClassOffset(); } typeDefinition = typeDefinition.getSuperClass(); } return HashCodeMethod.usingDefaultOffset(); }
@Override protected EqualsMethod equalsMethod(TypeDescription instrumentedType) { TypeDefinition typeDefinition = instrumentedType.getSuperClass(); while (typeDefinition != null && !typeDefinition.represents(Object.class)) { if (typeDefinition.asErasure().getDeclaredAnnotations().isAnnotationPresent(Enhance.class)) { return EqualsMethod.requiringSuperClassEquality(); } MethodList<?> hashCode = typeDefinition.getDeclaredMethods().filter(isHashCode()); if (!hashCode.isEmpty()) { return hashCode.getOnly().isAbstract() ? EqualsMethod.isolated() : EqualsMethod.requiringSuperClassEquality(); } typeDefinition = typeDefinition.getSuperClass().asErasure(); } return EqualsMethod.isolated(); } },
private static BiFunction<StateNode, BeanModelType<?>, Object> createProxyConstructor( ClassLoader classLoader, Builder<?> proxyBuilder) { Class<?> proxyType = proxyBuilder // Handle bean methods (and abstract methods for error handling) .method(method -> isAccessor(method) || method.isAbstract()) .intercept(MethodDelegation.to(proxyHandler)) // Handle internal $stateNode methods .defineField("$stateNode", StateNode.class) .method(method -> "$stateNode".equals(method.getName())) .intercept(FieldAccessor.ofField("$stateNode")) // Handle internal $modelType methods .defineField("$modelType", BeanModelType.class) .method(method -> "$modelType".equals(method.getName())) .intercept(FieldAccessor.ofField("$modelType")) // Create the class .make().load(classLoader, ClassLoadingStrategy.Default.WRAPPER) .getLoaded(); return (node, modelType) -> { Object instance = ReflectTools.createInstance(proxyType); ModelProxy modelProxy = (ModelProxy) instance; modelProxy.$stateNode(node); modelProxy.$modelType(modelType); return instance; }; }
private static BiFunction<StateNode, BeanModelType<?>, Object> createProxyConstructor( ClassLoader classLoader, Builder<?> proxyBuilder, String classFqn) { String proxyClassName = generateProxyClassName(classFqn, classLoader); Class<?> proxyType = proxyBuilder // Handle bean methods (and abstract methods for error handling) .method(method -> isAccessor(method) || method.isAbstract()) .intercept(MethodDelegation.to(proxyHandler)) // Handle internal $stateNode methods .defineField("$stateNode", StateNode.class) .method(method -> "$stateNode".equals(method.getName())) .intercept(FieldAccessor.ofField("$stateNode")) // Handle internal $modelType methods .defineField("$modelType", BeanModelType.class) .method(method -> "$modelType".equals(method.getName())) .intercept(FieldAccessor.ofField("$modelType")) // Create the class .name(proxyClassName).make() .load(classLoader, ClassLoadingStrategy.Default.WRAPPER) .getLoaded(); return (node, modelType) -> { Object instance = ReflectTools.createProxyInstance(proxyType, modelType.getProxyType()); ModelProxy modelProxy = (ModelProxy) instance; modelProxy.$stateNode(node); modelProxy.$modelType(modelType); modelType.createInitialValues(node); return instance; }; }