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

spring.turbo.bean.classpath.ClassDef Maven / Gradle / Ivy

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *    ____             _            _____           _
 *   / ___| _ __  _ __(_)_ __   __ |_   _|   _ _ __| |__   ___
 *   \___ \| '_ \| '__| | '_ \ / _` || || | | | '__| '_ \ / _ \
 *    ___) | |_) | |  | | | | | (_| || || |_| | |  | |_) | (_) |
 *   |____/| .__/|_|  |_|_| |_|\__, ||_| \__,_|_|  |_.__/ \___/
 *         |_|                 |___/   https://github.com/yingzhuo/spring-turbo
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
package spring.turbo.bean.classpath;

import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.*;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
import spring.turbo.util.Asserts;

import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.util.Objects;
import java.util.Optional;

/**
 * 类路径扫描的结果
 *
 * @author 应卓
 * @since 2.0.9
 */
public final class ClassDef implements BeanDefinition, Comparable, Serializable {

    private final Class clazz;
    private final BeanDefinition bd;

    /**
     * 构造方法
     *
     * @param beanDefinition beanDefinition实例
     */
    public ClassDef(BeanDefinition beanDefinition) {
        this(beanDefinition, ClassUtils.getDefaultClassLoader());
    }

    /**
     * 构造方法
     *
     * @param beanDefinition beanDefinition实例
     * @param classLoader    类加载器
     */
    public ClassDef(BeanDefinition beanDefinition, @Nullable ClassLoader classLoader) {
        Asserts.notNull(beanDefinition);

        classLoader = Objects.requireNonNullElseGet(classLoader, ClassUtils::getDefaultClassLoader);

        this.bd = beanDefinition;
        var className = beanDefinition.getBeanClassName();
        Asserts.notNull(className);
        try {
            this.clazz = ClassUtils.forName(className, classLoader);
        } catch (Throwable e) {
            throw new IllegalStateException("Cannot load class: '" + className + "'");
        }
    }

    // -----------------------------------------------------------------------------------------------------------------

    /**
     * 获取类型
     *
     * @return 类型
     * @see #getBeanClassName()
     */
    public Class getBeanClass() {
        return this.clazz;
    }

    // -----------------------------------------------------------------------------------------------------------------

    public MergedAnnotations getMergedAnnotations() {
        return MergedAnnotations.search(MergedAnnotations.SearchStrategy.TYPE_HIERARCHY)
                .withRepeatableContainers(RepeatableContainers.none())
                .from(clazz);
    }

    public  MergedAnnotation getMergedAnnotation(Class annotationType) {
        return getMergedAnnotations().get(annotationType);
    }

    public  boolean isAnnotationPresent(Class annotationType) {
        return getMergedAnnotations().isPresent(annotationType);
    }

    public  boolean isAnnotationPresentDirectly(Class annotationType) {
        return getMergedAnnotations().isDirectlyPresent(annotationType);
    }

    @Nullable
    public  A getAnnotation(Class annotationType) {
        return AnnotationUtils.getAnnotation(clazz, annotationType);
    }

    public  A getRequiredAnnotation(Class annotationType) {
        A annotation = getAnnotation(annotationType);
        Asserts.notNull(annotation);
        return annotation;
    }

    public  AnnotationAttributes getAnnotationAttributes(Class annotationType) {
        return getAnnotationAttributes(annotationType, false, false);
    }

    public  AnnotationAttributes getAnnotationAttributes(Class annotationType, boolean classValuesAsString) {
        return getAnnotationAttributes(annotationType, classValuesAsString, false);
    }

    public  AnnotationAttributes getAnnotationAttributes(Class annotationType, boolean classValuesAsString, boolean nestedAnnotationsAsMap) {
        try {
            return AnnotationUtils.getAnnotationAttributes(
                    getRequiredAnnotation(annotationType),
                    classValuesAsString,
                    nestedAnnotationsAsMap
            );
        } catch (Exception e) {
            return new AnnotationAttributes(annotationType);
        }
    }

    // -----------------------------------------------------------------------------------------------------------------

    /**
     * {@inheritDoc}
     */
    @Override
    public int compareTo(@Nullable ClassDef o) {
        var o1 = this.getBeanClassName();
        var o2 = Optional.ofNullable(o).map(ClassDef::getBeanClassName).orElse(null);

        if (o1 == null && o2 == null) {
            return 0;
        }
        if (o1 == null) {
            return 1;
        }
        if (o2 == null) {
            return -1;
        }
        return o1.compareTo(o2);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return "ClassDef[" + getBeanClassName() + "]";
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ClassDef classDef = (ClassDef) o;
        return clazz.equals(classDef.clazz);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return Objects.hash(clazz);
    }

    // -----------------------------------------------------------------------------------------------------------------

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getParentName() {
        return bd.getParentName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setParentName(String parentName) {
        bd.setParentName(parentName);
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getBeanClassName() {
        return bd.getBeanClassName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setBeanClassName(String beanClassName) {
        bd.setBeanClassName(beanClassName);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getScope() {
        return bd.getScope();
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public void setScope(String scope) {
        bd.setScope(scope);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isLazyInit() {
        return bd.isLazyInit();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setLazyInit(boolean lazyInit) {
        bd.setLazyInit(lazyInit);
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String[] getDependsOn() {
        return bd.getDependsOn();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setDependsOn(String... dependsOn) {
        bd.setDependsOn(dependsOn);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isAutowireCandidate() {
        return bd.isAutowireCandidate();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setAutowireCandidate(boolean autowireCandidate) {
        bd.setAutowireCandidate(autowireCandidate);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isPrimary() {
        return bd.isPrimary();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setPrimary(boolean primary) {
        bd.setPrimary(primary);
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getFactoryBeanName() {
        return bd.getFactoryBeanName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setFactoryBeanName(String factoryBeanName) {
        bd.setFactoryBeanName(factoryBeanName);
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getFactoryMethodName() {
        return bd.getFactoryMethodName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setFactoryMethodName(String factoryMethodName) {
        bd.setFactoryMethodName(factoryMethodName);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ConstructorArgumentValues getConstructorArgumentValues() {
        return bd.getConstructorArgumentValues();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public MutablePropertyValues getPropertyValues() {
        return bd.getPropertyValues();
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getInitMethodName() {
        return bd.getInitMethodName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setInitMethodName(String initMethodName) {
        bd.setInitMethodName(initMethodName);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String getDestroyMethodName() {
        return bd.getDestroyMethodName();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setDestroyMethodName(String destroyMethodName) {
        bd.setDestroyMethodName(destroyMethodName);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int getRole() {
        return bd.getRole();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setRole(int role) {
        bd.setRole(role);
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getDescription() {
        return bd.getDescription();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setDescription(String description) {
        bd.setDescription(description);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public ResolvableType getResolvableType() {
        return bd.getResolvableType();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isSingleton() {
        return bd.isSingleton();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isPrototype() {
        return bd.isPrototype();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean isAbstract() {
        return bd.isAbstract();
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public String getResourceDescription() {
        return bd.getDescription();
    }

    /**
     * {@inheritDoc}
     */
    @Nullable
    @Override
    public BeanDefinition getOriginatingBeanDefinition() {
        return bd.getOriginatingBeanDefinition();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void setAttribute(String name, Object value) {
        bd.setAttribute(name, value);
    }

    @Override
    public Object getAttribute(String name) {
        return bd.getAttribute(name);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public Object removeAttribute(String name) {
        return bd.removeAttribute(name);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean hasAttribute(String name) {
        return bd.hasAttribute(name);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String[] attributeNames() {
        return bd.attributeNames();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy