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

com.adrninistrator.javacg.dto.element.BaseElement Maven / Gradle / Ivy

package com.adrninistrator.javacg.dto.element;

import com.adrninistrator.javacg.exceptions.JavaCGRuntimeException;
import com.adrninistrator.javacg.util.JavaCGByteCodeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * @author adrninistrator
 * @date 2022/5/13
 * @description: 被操作元素的基类
 */
public abstract class BaseElement {
    private static final Logger logger = LoggerFactory.getLogger(BaseElement.class);

    protected String simpleClassName = this.getClass().getSimpleName();

    /*
        变量或常量的类型
        type需要使用getType()方法,因为ConstElement是通过方法返回的type
     */
    private String type;

    // 当前变量是否属于数组类型
    protected boolean arrayElement = false;

    /*
        数组对应的值
        key
            数组下标
        value
            数组的值
     */
    private Map arrayValueMap;

    // 变量或常量的常量值
    protected Object value;

    protected BaseElement() {
    }

    protected BaseElement(String type, boolean arrayElement) {
        this.type = type;
        /*
            当外部参数指定当前属于数组类型,或类型字符串属于数组形式时,都认为是数组类型
            由于当前构造函数中会根据类型字符串判断是否属于数组形式,因此外层可以不判断类型字符串
         */
        this.arrayElement = arrayElement || JavaCGByteCodeUtil.isArrayType(type);
        if (this.arrayElement) {
            arrayValueMap = new HashMap<>();
        }
    }

    public abstract BaseElement copyElement();

    public int getElementSize() {
        return JavaCGByteCodeUtil.getTypeSize(getType());
    }

    public void checkTypeString(String expectedType) {
        if (!logger.isDebugEnabled()) {
            return;
        }

        String actualType = getType();
        if (JavaCGByteCodeUtil.isNullType(actualType)) {
            return;
        }

        if (JavaCGByteCodeUtil.compareType(actualType, expectedType)) {
            return;
        }

        logger.error("类型与预期的不一致 {} expectedType: {}", this, expectedType);
    }

    /**
     * 记录数组指定下标的元素
     *
     * @param index
     * @param value
     */
    public void setElement(int index, BaseElement value) {
        if (!arrayElement) {
            throw new JavaCGRuntimeException("当前类不是数组类型");
        }
        arrayValueMap.put(index, value);
    }

    public Map getArrayValueMap() {
        if (!arrayElement) {
            throw new JavaCGRuntimeException("当前类不是数组类型");
        }
        return arrayValueMap;
    }

    public void setArrayValueMap(Map arrayValueMap) {
        this.arrayValueMap = arrayValueMap;
    }

    public String getType() {
        return type;
    }

    public boolean isArrayElement() {
        return arrayElement;
    }

    public Object getValue() {
        return value;
    }

    @Override
    public String toString() {
        return simpleClassName + " type: " + getType() + " value: " + value + String.format(" (%x)", System.identityHashCode(this));
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy