2 个不稳定版本
0.2.0 | 2024年1月30日 |
---|---|
0.1.0 | 2024年1月20日 |
#125 在 FFI
45KB
917 行
Hier
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