All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alibaba.bytekit.asm.matcher.SimpleInterfaceMatcher Maven / Gradle / Ivy

package com.alibaba.bytekit.asm.matcher;

import java.security.ProtectionDomain;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import com.alibaba.bytekit.asm.meta.ClassMetaService;
import com.alibaba.bytekit.utils.AsmUtils;
import com.alibaba.bytekit.utils.ClassLoaderUtils;

/**
 * 
 * @author hengyunabc 2020-11-25
 *
 */
public class SimpleInterfaceMatcher implements ClassMatcher {

    private Set interfaces = new HashSet();

    /**
     * 保存另一份转换为 internal 的数据,避免每次match转换
     */
    private Set internalInterfaces = new HashSet();

    public SimpleInterfaceMatcher(String... interfaces) {
        for (String name : interfaces) {
            add(name);
        }
    }

    public SimpleInterfaceMatcher(Collection interfaces) {
        for (String name : interfaces) {
            add(name);
        }
    }

    private void add(String name) {
        interfaces.add(name);
        internalInterfaces.add(AsmUtils.internalClassName(name));
    }

    @Override
    public boolean match(ClassLoader loader, String className, Class classBeingRedefined,
            ProtectionDomain protectionDomain, byte[] classfileBuffer) {
        loader = ClassLoaderUtils.wrap(loader);

        if (classBeingRedefined != null) {
            /**
             * 在retransform 时,类已经加载好,可以直接判断 TODO 哪种判断方式更快?
             */
            return match(classBeingRedefined);
        } else {
            Set allInterfaces = ClassMetaService.allInterfaces(loader, className, classfileBuffer);
            for (String i : internalInterfaces) {
                if (allInterfaces.contains(i)) {
                    return true;
                }
            }
        }

        return false;
    }

    private boolean matchInterface(Class i) {
        if (this.interfaces != null && interfaces.contains(i.getName())) {
            return true;
        }
        for (Class iter : i.getInterfaces()) {
            if (matchInterface(iter)) {
                return true;
            }
        }
        return false;
    }

    private boolean matchClass(Class clazz) {
        for (Class i : clazz.getInterfaces()) {
            if (matchInterface(i)) {
                return true;
            }
        }
        Class superclass = clazz.getSuperclass();
        if (Object.class.equals(superclass)) {
            return false;
        } else {
            if (matchClass(superclass)) {
                return true;
            }
        }
        return false;
    }

    private boolean match(Class clazz) {
        if (clazz.isInterface()) {
            return matchInterface(clazz);
        }
        return matchClass(clazz);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy