#java-class #jvm #jni #hierarchy #lookup #interface #extending

hier

通过扩展 JNI 接口支持 JVM 类层次结构查找的库

2 个不稳定版本

0.2.0 2024年1月30日
0.1.0 2024年1月20日

#125FFI

MIT 许可证

45KB
917

Hier

crates.io Docs badge

Hier 是一个通过扩展 JNI 接口支持 JVM 类层次结构查找的库。

安装

要使用 Hier,您需要在机器上完成 JDK 的安装(另外,还需要设置环境变量,例如 JAVA_HOME)。

使用方法

如果不从现有的 Java 应用程序调用,您需要启用 invocation 功能,然后使用 ClassPool::from_permanent_env 来构建一个 ClassPool

获取两个类的公共超类

use hier::class::Class;
use hier::classpool::ClassPool;
use hier::errors::HierError;

fn main() {
    let mut cp = ClassPool::from_permanent_env().unwrap();
    let mut integer_class = cp.lookup_class("java.lang.Integer").unwrap();
    let mut float_class = cp.lookup_class("java.lang.Float").unwrap();
    let mut most_common_superclass =
        find_most_common_superclass(&mut cp, &mut integer_class, &mut float_class).unwrap();

    println!("{}", most_common_superclass.name(&mut cp).unwrap());
}

fn find_most_common_superclass(
    cp: &mut ClassPool,
    class1: &mut Class,
    class2: &mut Class,
) -> Result<Class, HierError> {
    if class2.is_assignable_from(cp, class1)? {
        return Ok(class1.clone());
    }

    if class1.is_assignable_from(cp, class2)? {
        return Ok(class2.clone());
    }

    if class1.is_interface(cp)? || class2.is_interface(cp)? {
        return cp.lookup_class("java.lang.Object");
    }

    let mut cls1 = class1.clone();
    while {
        cls1 = match cls1.superclass(cp)? {
            Some(superclass) => superclass,
            None => return Ok(cls1),
        };

        !cls1.is_assignable_from(cp, class2)?
    } {}

    Ok(cls1)
}

获取类的派生接口

use hier::classpool::ClassPool;

fn main() {
    let mut cp = ClassPool::from_permanent_env().unwrap();
    let mut integer_class = cp.lookup_class("java.lang.Integer").unwrap();
    let mut interfaces = integer_class.interfaces(&mut cp).unwrap();
    let interface_names = interfaces
        .iter_mut()
        .map(|interface_class| interface_class.name(&mut cp))
        .collect::<Result<Vec<_>, _>>()
        .unwrap();

    println!("{interface_names:#?}");
}

许可证

Hier 根据 MIT 许可证授权。

依赖关系

~2–11MB
~119K SLoC