Search in sources :

Example 6 with RETURN

use of org.apache.xbean.asm6.Opcodes.RETURN in project component-runtime by Talend.

the class ProxyGenerator method generateProxy.

public Class<?> generateProxy(final ClassLoader loader, final Class<?> classToProxy, final String plugin, final String key) {
    final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    final String proxyClassName = fixPreservedPackages((classToProxy.getSigners() != null ? getSignedClassProxyName(classToProxy) : classToProxy.getName()) + "$$TalendServiceProxy");
    final String classFileName = proxyClassName.replace('.', '/');
    final String[] interfaceNames = { Type.getInternalName(Serializable.class) };
    final String superClassName = Type.getInternalName(classToProxy);
    cw.visit(findJavaVersion(classToProxy), ACC_PUBLIC + ACC_SUPER + ACC_SYNTHETIC, classFileName, null, superClassName, interfaceNames);
    cw.visitSource(classFileName + ".java", null);
    if (!Serializable.class.isAssignableFrom(classToProxy)) {
        try {
            classToProxy.getMethod("writeReplace");
        } catch (final NoSuchMethodException e) {
            createSerialisation(cw, plugin, key);
        }
    }
    final boolean hasInterceptors = hasInterceptors(classToProxy);
    if (hasInterceptors) {
        cw.visitField(ACC_PRIVATE, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class), null, null).visitEnd();
        cw.visitField(ACC_PRIVATE | ACC_STATIC, FIELD_INTERCEPTED_METHODS, Type.getDescriptor(Method[].class), null, null).visitEnd();
    }
    createConstructor(cw, classToProxy, superClassName, classFileName, Stream.of(classToProxy.getDeclaredConstructors()).filter(c -> {
        final int modifiers = c.getModifiers();
        return Modifier.isPublic(modifiers) || Modifier.isProtected(modifiers);
    }).sorted((o1, o2) -> {
        // prefer public constructor and then the smallest parameter count
        final int mod1 = o1.getModifiers();
        final int mod2 = o2.getModifiers();
        if (Modifier.isProtected(mod1) && !Modifier.isPublic(mod2)) {
            return 1;
        }
        if (Modifier.isProtected(mod2) && !Modifier.isPublic(mod1)) {
            return -1;
        }
        return o1.getParameterCount() - o2.getParameterCount();
    }).findFirst().orElseThrow(() -> new IllegalArgumentException(classToProxy + " has no default constructor, put at least a protected one")), hasInterceptors);
    final Method[] interceptedMethods;
    if (hasInterceptors) {
        final Collection<Annotation> globalInterceptors = Stream.of(classToProxy.getAnnotations()).filter(this::isInterceptor).collect(toList());
        final AtomicInteger methodIndex = new AtomicInteger();
        interceptedMethods = Stream.of(classToProxy.getMethods()).filter(m -> !"<init>".equals(m.getName()) && (!globalInterceptors.isEmpty() || Stream.of(m.getAnnotations()).anyMatch(this::isInterceptor))).peek(method -> delegateMethod(cw, method, classFileName, methodIndex.getAndIncrement())).toArray(Method[]::new);
    } else {
        interceptedMethods = null;
    }
    final Class<Object> objectClass = Unsafes.defineAndLoadClass(loader, proxyClassName, cw.toByteArray());
    if (hasInterceptors) {
        try {
            final Field interceptedMethodsField = objectClass.getDeclaredField(FIELD_INTERCEPTED_METHODS);
            interceptedMethodsField.setAccessible(true);
            interceptedMethodsField.set(null, interceptedMethods);
        } catch (final Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return objectClass;
}
Also used : ILOAD(org.apache.xbean.asm6.Opcodes.ILOAD) IRETURN(org.apache.xbean.asm6.Opcodes.IRETURN) Intercepts(org.talend.sdk.component.api.service.interceptor.Intercepts) ClassReader(org.apache.xbean.asm6.ClassReader) LRETURN(org.apache.xbean.asm6.Opcodes.LRETURN) V1_8(org.apache.xbean.asm6.Opcodes.V1_8) Type(org.apache.xbean.asm6.Type) ACC_PUBLIC(org.apache.xbean.asm6.Opcodes.ACC_PUBLIC) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ACC_PRIVATE(org.apache.xbean.asm6.Opcodes.ACC_PRIVATE) ALOAD(org.apache.xbean.asm6.Opcodes.ALOAD) ACC_SUPER(org.apache.xbean.asm6.Opcodes.ACC_SUPER) Method(java.lang.reflect.Method) IFEQ(org.apache.xbean.asm6.Opcodes.IFEQ) PUTFIELD(org.apache.xbean.asm6.Opcodes.PUTFIELD) GETFIELD(org.apache.xbean.asm6.Opcodes.GETFIELD) BIPUSH(org.apache.xbean.asm6.Opcodes.BIPUSH) ACC_SYNTHETIC(org.apache.xbean.asm6.Opcodes.ACC_SYNTHETIC) Collection(java.util.Collection) NEW(org.apache.xbean.asm6.Opcodes.NEW) LLOAD(org.apache.xbean.asm6.Opcodes.LLOAD) Serializable(java.io.Serializable) AASTORE(org.apache.xbean.asm6.Opcodes.AASTORE) ACC_VARARGS(org.apache.xbean.asm6.Opcodes.ACC_VARARGS) Stream(java.util.stream.Stream) EmptyVisitor(org.apache.xbean.asm6.shade.commons.EmptyVisitor) INVOKEVIRTUAL(org.apache.xbean.asm6.Opcodes.INVOKEVIRTUAL) Modifier(java.lang.reflect.Modifier) SIPUSH(org.apache.xbean.asm6.Opcodes.SIPUSH) Annotation(java.lang.annotation.Annotation) FRETURN(org.apache.xbean.asm6.Opcodes.FRETURN) CHECKCAST(org.apache.xbean.asm6.Opcodes.CHECKCAST) ASTORE(org.apache.xbean.asm6.Opcodes.ASTORE) InterceptorHandler(org.talend.sdk.component.api.service.interceptor.InterceptorHandler) DLOAD(org.apache.xbean.asm6.Opcodes.DLOAD) INVOKESTATIC(org.apache.xbean.asm6.Opcodes.INVOKESTATIC) Label(org.apache.xbean.asm6.Label) ATHROW(org.apache.xbean.asm6.Opcodes.ATHROW) Constructor(java.lang.reflect.Constructor) ANEWARRAY(org.apache.xbean.asm6.Opcodes.ANEWARRAY) AALOAD(org.apache.xbean.asm6.Opcodes.AALOAD) ACC_PROTECTED(org.apache.xbean.asm6.Opcodes.ACC_PROTECTED) POP(org.apache.xbean.asm6.Opcodes.POP) ICONST_0(org.apache.xbean.asm6.Opcodes.ICONST_0) ICONST_2(org.apache.xbean.asm6.Opcodes.ICONST_2) SKIP_DEBUG(org.apache.xbean.asm6.ClassReader.SKIP_DEBUG) ICONST_1(org.apache.xbean.asm6.Opcodes.ICONST_1) INVOKEINTERFACE(org.apache.xbean.asm6.Opcodes.INVOKEINTERFACE) INVOKESPECIAL(org.apache.xbean.asm6.Opcodes.INVOKESPECIAL) ICONST_4(org.apache.xbean.asm6.Opcodes.ICONST_4) ICONST_3(org.apache.xbean.asm6.Opcodes.ICONST_3) FLOAD(org.apache.xbean.asm6.Opcodes.FLOAD) ACONST_NULL(org.apache.xbean.asm6.Opcodes.ACONST_NULL) RETURN(org.apache.xbean.asm6.Opcodes.RETURN) Field(java.lang.reflect.Field) MethodVisitor(org.apache.xbean.asm6.MethodVisitor) ACC_STATIC(org.apache.xbean.asm6.Opcodes.ACC_STATIC) ObjectStreamException(java.io.ObjectStreamException) Collectors.toList(java.util.stream.Collectors.toList) DRETURN(org.apache.xbean.asm6.Opcodes.DRETURN) GETSTATIC(org.apache.xbean.asm6.Opcodes.GETSTATIC) DUP(org.apache.xbean.asm6.Opcodes.DUP) ClassWriter(org.apache.xbean.asm6.ClassWriter) ICONST_5(org.apache.xbean.asm6.Opcodes.ICONST_5) ARETURN(org.apache.xbean.asm6.Opcodes.ARETURN) AllArgsConstructor(lombok.AllArgsConstructor) InputStream(java.io.InputStream) Serializable(java.io.Serializable) Method(java.lang.reflect.Method) ClassWriter(org.apache.xbean.asm6.ClassWriter) Annotation(java.lang.annotation.Annotation) ObjectStreamException(java.io.ObjectStreamException) Field(java.lang.reflect.Field) AtomicInteger(java.util.concurrent.atomic.AtomicInteger)

Example 7 with RETURN

use of org.apache.xbean.asm6.Opcodes.RETURN in project component-runtime by Talend.

the class ProxyGenerator method delegateMethod.

private void delegateMethod(final ClassWriter cw, final Method method, final String proxyClassFileName, final int methodIndex) {
    final Class<?> returnType = method.getReturnType();
    final Class<?>[] parameterTypes = method.getParameterTypes();
    final Class<?>[] exceptionTypes = method.getExceptionTypes();
    final int modifiers = method.getModifiers();
    if (Modifier.isFinal(modifiers) || Modifier.isStatic(modifiers)) {
        throw new IllegalStateException("It's not possible to proxy a final or static method: " + method.getDeclaringClass().getName() + " " + method.getName());
    }
    // push the method definition
    int modifier = modifiers & (ACC_PUBLIC | ACC_PROTECTED | ACC_VARARGS);
    MethodVisitor mv = cw.visitMethod(modifier, method.getName(), Type.getMethodDescriptor(method), null, null);
    mv.visitCode();
    // push try/catch block, to catch declared exceptions, and to catch java.lang.Throwable
    final Label l0 = new Label();
    final Label l1 = new Label();
    final Label l2 = new Label();
    if (exceptionTypes.length > 0) {
        mv.visitTryCatchBlock(l0, l1, l2, "java/lang/reflect/InvocationTargetException");
    }
    // push try code
    mv.visitLabel(l0);
    final String classNameToOverride = method.getDeclaringClass().getName().replace('.', '/');
    mv.visitLdcInsn(Type.getType("L" + classNameToOverride + ";"));
    // the following code generates the bytecode for this line of Java:
    // Method method = <proxy>.class.getMethod("add", new Class[] { <array of function argument classes> });
    // get the method name to invoke, and push to stack
    mv.visitLdcInsn(method.getName());
    // create the Class[]
    createArrayDefinition(mv, parameterTypes.length, Class.class);
    int length = 1;
    // push parameters into array
    for (int i = 0; i < parameterTypes.length; i++) {
        // keep copy of array on stack
        mv.visitInsn(DUP);
        Class<?> parameterType = parameterTypes[i];
        // push number onto stack
        pushIntOntoStack(mv, i);
        if (parameterType.isPrimitive()) {
            String wrapperType = getWrapperType(parameterType);
            mv.visitFieldInsn(GETSTATIC, wrapperType, "TYPE", "Ljava/lang/Class;");
        } else {
            mv.visitLdcInsn(Type.getType(parameterType));
        }
        mv.visitInsn(AASTORE);
        if (Long.TYPE.equals(parameterType) || Double.TYPE.equals(parameterType)) {
            length += 2;
        } else {
            length++;
        }
    }
    // the following code generates bytecode equivalent to:
    // return ((<returntype>) invocationHandler.invoke(this, {methodIndex}, new Object[] { <function arguments
    // }))[.<primitive>Value()];
    final Label l4 = new Label();
    mv.visitLabel(l4);
    mv.visitVarInsn(ALOAD, 0);
    // get the invocationHandler field from this class
    mv.visitFieldInsn(GETFIELD, proxyClassFileName, FIELD_INTERCEPTOR_HANDLER, Type.getDescriptor(InterceptorHandler.class));
    // add the Method from the static array as first parameter
    mv.visitFieldInsn(GETSTATIC, proxyClassFileName, FIELD_INTERCEPTED_METHODS, Type.getDescriptor(Method[].class));
    // push the methodIndex of the current method
    if (methodIndex < 128) {
        mv.visitIntInsn(BIPUSH, methodIndex);
    } else if (methodIndex < 32267) {
        // for methods > 127 we need to push a short number as index
        mv.visitIntInsn(SIPUSH, methodIndex);
    } else {
        throw new IllegalStateException("Sorry, we only support Classes with 2^15 methods...");
    }
    // and now load the Method from the array
    mv.visitInsn(AALOAD);
    // prepare the parameter array as Object[] and store it on the stack
    pushMethodParameterArray(mv, parameterTypes);
    // invoke the invocationHandler
    mv.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(InterceptorHandler.class), "invoke", "(Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;", true);
    // cast the result
    mv.visitTypeInsn(CHECKCAST, getCastType(returnType));
    if (returnType.isPrimitive() && (!Void.TYPE.equals(returnType))) {
        // get the primitive value
        mv.visitMethodInsn(INVOKEVIRTUAL, getWrapperType(returnType), getPrimitiveMethod(returnType), "()" + Type.getDescriptor(returnType), false);
    }
    // push return
    mv.visitLabel(l1);
    if (!Void.TYPE.equals(returnType)) {
        mv.visitInsn(getReturnInsn(returnType));
    } else {
        mv.visitInsn(POP);
        mv.visitInsn(RETURN);
    }
    // catch InvocationTargetException
    if (exceptionTypes.length > 0) {
        mv.visitLabel(l2);
        mv.visitVarInsn(ASTORE, length);
        Label l5 = new Label();
        mv.visitLabel(l5);
        for (int i = 0; i < exceptionTypes.length; i++) {
            Class<?> exceptionType = exceptionTypes[i];
            mv.visitLdcInsn(Type.getType("L" + exceptionType.getCanonicalName().replace('.', '/') + ";"));
            mv.visitVarInsn(ALOAD, length);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/InvocationTargetException", "getCause", "()Ljava/lang/Throwable;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false);
            final Label l6 = new Label();
            mv.visitJumpInsn(IFEQ, l6);
            final Label l7 = new Label();
            mv.visitLabel(l7);
            mv.visitVarInsn(ALOAD, length);
            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/InvocationTargetException", "getCause", "()Ljava/lang/Throwable;", false);
            mv.visitTypeInsn(CHECKCAST, getCastType(exceptionType));
            mv.visitInsn(ATHROW);
            mv.visitLabel(l6);
            if (i == (exceptionTypes.length - 1)) {
                mv.visitTypeInsn(NEW, "java/lang/reflect/UndeclaredThrowableException");
                mv.visitInsn(DUP);
                mv.visitVarInsn(ALOAD, length);
                mv.visitMethodInsn(INVOKESPECIAL, "java/lang/reflect/UndeclaredThrowableException", "<init>", "(Ljava/lang/Throwable;)V", false);
                mv.visitInsn(ATHROW);
            }
        }
    }
    // finish this method
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}
Also used : InterceptorHandler(org.talend.sdk.component.api.service.interceptor.InterceptorHandler) Label(org.apache.xbean.asm6.Label) MethodVisitor(org.apache.xbean.asm6.MethodVisitor)

Example 8 with RETURN

use of org.apache.xbean.asm6.Opcodes.RETURN in project component-runtime by Talend.

the class RepositoryModelBuilderTest method createChainPlugin.

private File createChainPlugin(final File dir, final String plugin) {
    final File target = new File(dir, plugin);
    try (final JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(target))) {
        final String packageName = toPackage(target.getParentFile().getParentFile().getName()).replace(".", "/");
        final String sourcePackage = "org/talend/test";
        final String fromPack = sourcePackage.replace('/', '.');
        final String toPack = packageName.replace('.', '/');
        final File root = new File(jarLocation(getClass()), sourcePackage);
        ofNullable(root.listFiles()).map(Stream::of).orElseGet(Stream::empty).filter(c -> c.getName().endsWith(".class")).forEach(clazz -> {
            try (final InputStream is = new FileInputStream(clazz)) {
                final ClassReader reader = new ClassReader(is);
                final ClassWriter writer = new ClassWriter(COMPUTE_FRAMES);
                reader.accept(new ClassRemapper(writer, new Remapper() {

                    @Override
                    public String map(final String key) {
                        return key.replace(sourcePackage, toPack).replace(fromPack, packageName);
                    }
                }), EXPAND_FRAMES);
                outputStream.putNextEntry(new JarEntry(toPack + '/' + clazz.getName()));
                outputStream.write(writer.toByteArray());
            } catch (final IOException e) {
                fail(e.getMessage());
            }
        });
    } catch (final IOException e) {
        throw new IllegalStateException(e);
    }
    return target;
}
Also used : Assertions.fail(org.junit.jupiter.api.Assertions.fail) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) ComponentFamilyMeta(org.talend.sdk.component.runtime.manager.ComponentFamilyMeta) HashMap(java.util.HashMap) ClassReader(org.apache.xbean.asm6.ClassReader) Collections.singletonList(java.util.Collections.singletonList) DataStore1(org.talend.test.DataStore1) JarEntry(java.util.jar.JarEntry) Collections.singleton(java.util.Collections.singleton) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) WithTemporaryFolder(org.talend.sdk.component.junit.base.junit5.WithTemporaryFolder) ParameterModelService(org.talend.sdk.component.runtime.manager.reflect.ParameterModelService) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) EXPAND_FRAMES(org.apache.xbean.asm6.ClassReader.EXPAND_FRAMES) JarOutputStream(java.util.jar.JarOutputStream) Remapper(org.apache.xbean.asm6.commons.Remapper) ParameterMeta(org.talend.sdk.component.runtime.manager.ParameterMeta) Collections.emptyMap(java.util.Collections.emptyMap) COMPUTE_FRAMES(org.apache.xbean.asm6.ClassWriter.COMPUTE_FRAMES) Container(org.talend.sdk.component.container.Container) Collections.emptyList(java.util.Collections.emptyList) Optional.ofNullable(java.util.Optional.ofNullable) FileOutputStream(java.io.FileOutputStream) WrappingStore(org.talend.test.WrappingStore) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) IdGenerator(org.talend.sdk.component.runtime.manager.util.IdGenerator) File(java.io.File) TestInfo(org.junit.jupiter.api.TestInfo) RepositoryModel(org.talend.sdk.component.design.extension.RepositoryModel) Test(org.junit.jupiter.api.Test) Collectors.toList(java.util.stream.Collectors.toList) List(java.util.List) Stream(java.util.stream.Stream) TemporaryFolder(org.talend.sdk.component.junit.base.junit5.TemporaryFolder) JarLocation.jarLocation(org.apache.ziplock.JarLocation.jarLocation) ClassWriter(org.apache.xbean.asm6.ClassWriter) ComponentManager(org.talend.sdk.component.runtime.manager.ComponentManager) MigrationHandlerFactory(org.talend.sdk.component.runtime.manager.reflect.MigrationHandlerFactory) ReflectionService(org.talend.sdk.component.runtime.manager.reflect.ReflectionService) InputStream(java.io.InputStream) PartitionMapper1(org.talend.test.PartitionMapper1) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) JarOutputStream(java.util.jar.JarOutputStream) IOException(java.io.IOException) JarEntry(java.util.jar.JarEntry) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) FileInputStream(java.io.FileInputStream) ClassWriter(org.apache.xbean.asm6.ClassWriter) ClassRemapper(org.apache.xbean.asm6.commons.ClassRemapper) Remapper(org.apache.xbean.asm6.commons.Remapper) FileOutputStream(java.io.FileOutputStream) ClassReader(org.apache.xbean.asm6.ClassReader) JarOutputStream(java.util.jar.JarOutputStream) FileOutputStream(java.io.FileOutputStream) FileInputStream(java.io.FileInputStream) Stream(java.util.stream.Stream) InputStream(java.io.InputStream) File(java.io.File)

Example 9 with RETURN

use of org.apache.xbean.asm6.Opcodes.RETURN in project geronimo-xbean by apache.

the class XbeanAsmParameterNameLoader method getAllMethodParameters.

/**
 * Gets the parameter names of all methods with the specified name or null if the class was compiled without debug symbols on.
 * @param clazz the class for which the method parameter names should be retrieved
 * @param methodName the of the method for which the parameters should be retrieved
 * @return a map from Method object to the parameter names or null if the class was compiled without debug symbols on
 */
public Map<Method, List<String>> getAllMethodParameters(Class clazz, String methodName) {
    // Determine the constructors?
    Method[] methods = getMethods(clazz, methodName);
    if (methods.length == 0) {
        return Collections.emptyMap();
    }
    // Check the cache
    if (methodCache.containsKey(methods[0])) {
        Map<Method, List<String>> methodParameters = new HashMap<Method, List<String>>();
        for (Method method : methods) {
            methodParameters.put(method, methodCache.get(method));
        }
        return methodParameters;
    }
    // Load the parameter names using ASM
    Map<Method, List<String>> methodParameters = new HashMap<Method, List<String>>();
    try {
        ClassReader reader = XbeanAsmParameterNameLoader.createClassReader(clazz);
        XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor visitor = new XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor(clazz, methodName);
        reader.accept(visitor, 0);
        Map exceptions = visitor.getExceptions();
        if (exceptions.size() == 1) {
            throw new RuntimeException((Exception) exceptions.values().iterator().next());
        }
        if (!exceptions.isEmpty()) {
            throw new RuntimeException(exceptions.toString());
        }
        methodParameters = visitor.getMethodParameters();
    } catch (IOException ex) {
    }
    // Cache the names
    for (Method method : methods) {
        methodCache.put(method, methodParameters.get(method));
    }
    return methodParameters;
}
Also used : HashMap(java.util.HashMap) WeakHashMap(java.util.WeakHashMap) Method(java.lang.reflect.Method) IOException(java.io.IOException) ClassReader(org.apache.xbean.asm6.ClassReader) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map) WeakHashMap(java.util.WeakHashMap)

Example 10 with RETURN

use of org.apache.xbean.asm6.Opcodes.RETURN in project geronimo-xbean by apache.

the class XbeanAsmParameterNameLoader method getAllConstructorParameters.

/**
 * Gets the parameter names of all constructor or null if the class was compiled without debug symbols on.
 * @param clazz the class for which the constructor parameter names should be retrieved
 * @return a map from Constructor object to the parameter names or null if the class was compiled without debug symbols on
 */
public Map<Constructor, List<String>> getAllConstructorParameters(Class clazz) {
    // Determine the constructors?
    List<Constructor> constructors = new ArrayList<Constructor>(Arrays.asList(clazz.getConstructors()));
    constructors.addAll(Arrays.asList(clazz.getDeclaredConstructors()));
    if (constructors.isEmpty()) {
        return Collections.emptyMap();
    }
    // Check the cache
    if (constructorCache.containsKey(constructors.get(0))) {
        Map<Constructor, List<String>> constructorParameters = new HashMap<Constructor, List<String>>();
        for (Constructor constructor : constructors) {
            constructorParameters.put(constructor, constructorCache.get(constructor));
        }
        return constructorParameters;
    }
    // Load the parameter names using ASM
    Map<Constructor, List<String>> constructorParameters = new HashMap<Constructor, List<String>>();
    try {
        ClassReader reader = XbeanAsmParameterNameLoader.createClassReader(clazz);
        XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor visitor = new XbeanAsmParameterNameLoader.AllParameterNamesDiscoveringVisitor(clazz);
        reader.accept(visitor, 0);
        Map exceptions = visitor.getExceptions();
        if (exceptions.size() == 1) {
            throw new RuntimeException((Exception) exceptions.values().iterator().next());
        }
        if (!exceptions.isEmpty()) {
            throw new RuntimeException(exceptions.toString());
        }
        constructorParameters = visitor.getConstructorParameters();
    } catch (IOException ex) {
    }
    // Cache the names
    for (Constructor constructor : constructors) {
        constructorCache.put(constructor, constructorParameters.get(constructor));
    }
    return constructorParameters;
}
Also used : HashMap(java.util.HashMap) WeakHashMap(java.util.WeakHashMap) Constructor(java.lang.reflect.Constructor) ArrayList(java.util.ArrayList) IOException(java.io.IOException) ClassReader(org.apache.xbean.asm6.ClassReader) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map) WeakHashMap(java.util.WeakHashMap)

Aggregations

ClassReader (org.apache.xbean.asm6.ClassReader)9 ClassWriter (org.apache.xbean.asm6.ClassWriter)7 MethodVisitor (org.apache.xbean.asm6.MethodVisitor)7 IOException (java.io.IOException)6 InputStream (java.io.InputStream)6 Stream (java.util.stream.Stream)4 ZipEntry (java.util.zip.ZipEntry)4 File (java.io.File)3 FileInputStream (java.io.FileInputStream)3 FileOutputStream (java.io.FileOutputStream)3 Constructor (java.lang.reflect.Constructor)3 Optional.ofNullable (java.util.Optional.ofNullable)3 JarEntry (java.util.jar.JarEntry)3 JarOutputStream (java.util.jar.JarOutputStream)3 EXPAND_FRAMES (org.apache.xbean.asm6.ClassReader.EXPAND_FRAMES)3 COMPUTE_FRAMES (org.apache.xbean.asm6.ClassWriter.COMPUTE_FRAMES)3 ClassRemapper (org.apache.xbean.asm6.commons.ClassRemapper)3 Remapper (org.apache.xbean.asm6.commons.Remapper)3 JarLocation.jarLocation (org.apache.ziplock.JarLocation.jarLocation)3 Assertions.fail (org.junit.jupiter.api.Assertions.fail)3