我来为您提供一个Java实现的Interface Constable示例。Interface Constable 是Java中的一个特殊接口,用于在运行时查询常量信息。

1. 基础示例

import java.lang.constant.*;

// 实现Constable接口的类
public class InterfaceConstableDemo {
    
    // 实现Constable接口的简单类
    static class Version implements Constable {
        private final int major;
        private final int minor;
        
        public Version(int major, int minor) {
            this.major = major;
            this.minor = minor;
        }
        
        @Override
        public Optional<? extends ConstantDesc> describeConstable() {
            // 返回一个ConstantDesc,这里使用MethodHandleDesc
            return Optional.of(MethodHandleDesc.of(
                DirectMethodHandleDesc.Kind.CONSTRUCTOR,
                ClassDesc.of("InterfaceConstableDemo$Version"),
                "of",
                MethodTypeDesc.of(
                    ClassDesc.of("InterfaceConstableDemo$Version"),
                    ClassDesc.of("int"),
                    ClassDesc.of("int")
                )
            ));
        }
        
        public static Version of(int major, int minor) {
            return new Version(major, minor);
        }
        
        @Override
        public String toString() {
            return "v" + major + "." + minor;
        }
    }
    
    // 更复杂的Constable实现
    static class Configuration implements Constable {
        private final String name;
        private final Version version;
        private final boolean enabled;
        
        public Configuration(String name, Version version, boolean enabled) {
            this.name = name;
            this.version = version;
            this.enabled = enabled;
        }
        
        @Override
        public Optional<DynamicConstantDesc<?>> describeConstable() {
            return Optional.of(DynamicConstantDesc.ofNamed(
                ConstantDescs.BSM_INVOKE,
                "config",
                ClassDesc.of("InterfaceConstableDemo$Configuration"),
                ConstantDescs.CD_String, name,
                version.describeConstable().orElseThrow(),
                ConstantDescs.CD_boolean, enabled
            ));
        }
        
        @Override
        public String toString() {
            return "Configuration{name='" + name + "', version=" + version + 
                   ", enabled=" + enabled + "}";
        }
    }
    
    public static void main(String[] args) {
        // 创建Constable对象
        Version v1 = new Version(1, 0);
        Version v2 = new Version(2, 1);
        
        Configuration config = new Configuration("app-config", v2, true);
        
        // 获取常量描述
        System.out.println("=== Version 常量描述 ===");
        Optional<? extends ConstantDesc> v1Desc = v1.describeConstable();
        v1Desc.ifPresent(desc -> {
            System.out.println("描述符: " + desc);
            System.out.println("显示名称: " + desc.displayName());
        });
        
        System.out.println("\n=== Configuration 常量描述 ===");
        config.describeConstable().ifPresent(desc -> {
            System.out.println("描述符: " + desc);
            System.out.println("显示名称: " + desc.displayName());
        });
        
        // 使用Constable的实用场景
        demonstrateConstableUsage();
    }
    
    private static void demonstrateConstableUsage() {
        System.out.println("\n=== Constable 实用示例 ===");
        
        // 枚举也实现了Constable
        System.out.println("枚举常量描述:");
        System.out.println("RED: " + Color.RED.describeConstable());
        System.out.println("GREEN: " + Color.GREEN.describeConstable());
        
        // 包装类型的Constable
        Integer number = 42;
        System.out.println("\n整数常量描述: " + number.describeConstable());
        
        String text = "Hello Constable";
        System.out.println("字符串常量描述: " + text.describeConstable());
    }
    
    enum Color implements Constable {
        RED, GREEN, BLUE;
        
        // 枚举自动实现describeConstable()
    }
}

2. 更完整的Constable实现

import java.lang.constant.*;
import java.util.*;
import java.util.stream.Collectors;

public class AdvancedConstableDemo {
    
    // 表示数学表达式的Constable类
    static class MathExpression implements Constable {
        private final String expression;
        private final List<Variable> variables;
        
        public MathExpression(String expression, List<Variable> variables) {
            this.expression = expression;
            this.variables = new ArrayList<>(variables);
        }
        
        @Override
        public Optional<DynamicConstantDesc<?>> describeConstable() {
            try {
                // 构建变量描述符列表
                ConstantDesc[] varDescs = variables.stream()
                    .map(v -> v.describeConstable()
                        .orElseThrow(() -> 
                            new IllegalStateException("无法描述变量: " + v)))
                    .toArray(ConstantDesc[]::new);
                
                // 构建方法类型描述符
                MethodTypeDesc mtd = MethodTypeDesc.of(
                    ClassDesc.of("AdvancedConstableDemo$MathExpression"),
                    Arrays.stream(varDescs)
                        .map(ConstantDesc::constantType)
                        .toArray(ClassDesc[]::new)
                );
                
                return Optional.of(DynamicConstantDesc.ofNamed(
                    ConstantDescs.BSM_INVOKE,
                    "expression",
                    ConstantDescs.CD_MathExpression,
                    ConstantDescs.CD_String, expression,
                    ConstantDescs.ofArray(ConstantDescs.CD_Variable, varDescs)
                ));
            } catch (Exception e) {
                return Optional.empty();
            }
        }
        
        @Override
        public String toString() {
            return expression + " with vars: " + variables;
        }
    }
    
    static class Variable implements Constable {
        private final String name;
        private final double value;
        
        public Variable(String name, double value) {
            this.name = name;
            this.value = value;
        }
        
        @Override
        public Optional<DynamicConstantDesc<?>> describeConstable() {
            return Optional.of(DynamicConstantDesc.ofNamed(
                ConstantDescs.BSM_INVOKE,
                "var",
                ConstantDescs.CD_Variable,
                ConstantDescs.CD_String, name,
                ConstantDescs.CD_double, value
            ));
        }
        
        @Override
        public String toString() {
            return name + "=" + value;
        }
    }
    
    public static void main(String[] args) {
        // 创建复杂的Constable对象
        Variable x = new Variable("x", 2.5);
        Variable y = new Variable("y", 3.0);
        
        MathExpression expr = new MathExpression(
            "x * y + 10", 
            Arrays.asList(x, y)
        );
        
        System.out.println("数学表达式: " + expr);
        
        // 获取常量描述
        Optional<? extends ConstantDesc> desc = expr.describeConstable();
        desc.ifPresent(d -> {
            System.out.println("\n常量描述:");
            System.out.println("类型: " + d.constantType());
            System.out.println("显示名称: " + d.displayName());
            System.out.println("解析常量名: " + d.resolveConstantDesc(MethodHandles.lookup()));
        });
        
        // 演示多个Constable对象的处理
        demonstrateMultipleConstables();
    }
    
    private static void demonstrateMultipleConstables() {
        System.out.println("\n=== 多个Constable对象处理 ===");
        
        List<Constable> constables = Arrays.asList(
            new Variable("temp", 25.5),
            new Variable("pressure", 101.3),
            new Variable("humidity", 65.0)
        );
        
        // 收集所有常量描述
        List<ConstantDesc> descriptions = constables.stream()
            .map(Constable::describeConstable)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.toList());
        
        System.out.println("收集到的常量描述数量: " + descriptions.size());
        descriptions.forEach(desc -> 
            System.out.println("  - " + desc.displayName()));
    }
}

3. 实用工具类

import java.lang.constant.*;
import java.util.*;
import java.lang.invoke.*;

public class ConstableUtils {
    
    // 检查对象是否可描述为常量
    public static boolean isConstable(Object obj) {
        return obj instanceof Constable;
    }
    
    // 获取对象的常量描述,如果可能的话
    public static Optional<ConstantDesc> getConstantDescription(Object obj) {
        if (obj instanceof Constable) {
            return ((Constable) obj).describeConstable();
        }
        return Optional.empty();
    }
    
    // 批量处理Constable对象
    public static List<ConstantDesc> describeConstables(List<?> objects) {
        return objects.stream()
            .filter(Constable.class::isInstance)
            .map(obj -> ((Constable) obj).describeConstable())
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collectors.toList());
    }
    
    // 创建动态常量
    public static DynamicConstantDesc<?> createDynamicConstant(
            String name, Class<?> type, Object... bootstrapArgs) {
        
        List<ConstantDesc> args = Arrays.stream(bootstrapArgs)
            .map(arg -> {
                if (arg instanceof Constable) {
                    return ((Constable) arg).describeConstable()
                        .orElse(ConstantDescs.of(arg));
                }
                return ConstantDescs.of(arg);
            })
            .collect(Collectors.toList());
        
        return DynamicConstantDesc.ofNamed(
            ConstantDescs.BSM_INVOKE,
            name,
            ClassDesc.of(type.getName()),
            args.toArray(new ConstantDesc[0])
        );
    }
    
    // 示例使用
    public static class AppConfig implements Constable {
        private final String appName;
        private final int version;
        private final boolean debug;
        
        public AppConfig(String appName, int version, boolean debug) {
            this.appName = appName;
            this.version = version;
            this.debug = debug;
        }
        
        @Override
        public Optional<DynamicConstantDesc<?>> describeConstable() {
            return Optional.of(ConstableUtils.createDynamicConstant(
                "AppConfig",
                AppConfig.class,
                appName, version, debug
            ));
        }
        
        @Override
        public String toString() {
            return String.format("AppConfig[%s v%d debug=%b]", 
                appName, version, debug);
        }
    }
    
    public static void main(String[] args) {
        // 使用工具类
        AppConfig config = new AppConfig("MyApp", 2, true);
        
        System.out.println("是否可描述为常量: " + isConstable(config));
        
        Optional<ConstantDesc> desc = getConstantDescription(config);
        desc.ifPresent(d -> {
            System.out.println("常量描述: " + d);
            try {
                Object resolved = d.resolveConstantDesc(MethodHandles.lookup());
                System.out.println("解析结果: " + resolved);
            } catch (Throwable t) {
                t.printStackTrace();
            }
        });
        
        // 批量处理
        List<Object> objects = Arrays.asList(
            config,
            "简单字符串",
            Integer.valueOf(100),
            new AppConfig("TestApp", 1, false)
        );
        
        List<ConstantDesc> descriptions = describeConstables(objects);
        System.out.println("\n批量处理的常量描述数量: " + descriptions.size());
    }
}

关键点说明:

  1. Interface Constable 的核心方法是 describeConstable(),它返回一个 Optional<ConstantDesc>

  2. 主要用途

    • 运行时查询常量信息
    • 动态常量创建
    • 反射和序列化的替代方案
  3. 常见实现类

    • 基本类型的包装类(Integer、Double等)
    • String类
    • 枚举类型
    • 类描述符(ClassDesc)
  4. ConstantDesc 类型

    • ClassDesc - 类描述符
    • MethodHandleDesc - 方法句柄描述符
    • MethodTypeDesc - 方法类型描述符
    • DynamicConstantDesc - 动态常量描述符

这些示例展示了如何在实际应用中使用Interface Constable,包括基础实现、高级用法和实用工具类。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐