更新:我在这里回答了我自己的问题:
-
[旧问题 - 已过时:]
在Java 9中获取ModuleReference给定Module对象的正确方法是什么?
考虑以下两种方法java.base:
Module mod = ModuleLayer.boot().findModule("java.base").orElse(null);
ModuleReference modRef = ModuleFinder.ofSystem().find("java.base").orElse(null);
Run Code Online (Sandbox Code Playgroud)
mod有一个方法Set<String> getPackages(),但是你只获得包的名称,你不能列出每个包中的资源.
modRef有一个方法ModuleReader open(),并ModuleReader有一个方法Stream<String> list()列出模块中的资源,这是我需要做的.
但是,对于通过向类路径添加非模块jar文件而生成的自动(因此未命名)模块,您无法获取ModuleReferencefrom ModuleFinder.ofSystem().find(String name)或ModuleFinder.ofSystem().findAll()- 您只能从中获取Module引用getClass().getModule().
我找不到任何方法来获得ModuleReference自动模块.我也找不到ModuleReference从Module对象获取a的方法,这意味着Module如果模块是自动和/或未命名的,我无法列出资源.
当然必须有一种方法来获得ModuleReference一个给定的(已经加载)Module?
我试图使用Java的LambdaMetaFactory动态实现一个通用的拉姆达Handler<RoutingContext>:
public class RoutingContext {
// ...
}
@FunctionalInterface
public interface Handler<X> {
public void handle(X arg);
}
public class HomeHandler extends Handler<RoutingContext> {
@Override
public void handle(RoutingContext ctx) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的尝试LambdaMetaFactory:
try {
Class<?> homeHandlerClass = HomeHandler.class;
Method method = homeHandlerClass.getDeclaredMethod(
"handle", RoutingContext.class);
Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.unreflect(method);
MethodType factoryMethodType = MethodType.methodType(Handler.class);
MethodType functionMethodType = mh.type();
MethodHandle implementationMethodHandle = mh;
Handler<RoutingContext> lambda =
(Handler<RoutingContext>) LambdaMetafactory.metafactory(
lookup,
"handle", …Run Code Online (Sandbox Code Playgroud) 给出以下Java代码:
import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
public class Test {
public static void main(String[] args) {
SimpleEntry<Integer, String> simpleEntry = new SimpleEntry<>(1, "1");
Optional<Entry<Integer, String>> optionalEntry = Optional.of(simpleEntry);
Optional<SimpleEntry<Integer, String>> optionalSimpleEntry = Optional.of(simpleEntry);
List<Entry<Integer, String>> list1 = Arrays.asList(simpleEntry);
List<Optional<Entry<Integer, String>>> list2 = Arrays.asList(optionalEntry);
List<Optional<SimpleEntry<Integer, String>>> list3 = Arrays.asList(optionalSimpleEntry);
List<Optional<Entry<Integer, String>>> list4 = Arrays.asList(optionalSimpleEntry);
}
}
Run Code Online (Sandbox Code Playgroud)
表达式可以初始化list,list2并且list3可以正常工作。但是,表达式初始化list4在Eclipse中因以下错误而中断:
Type mismatch: cannot convert from List<Optional<AbstractMap.SimpleEntry<Integer,String>>>
to List<Optional<Map.Entry<Integer,String>>>
Run Code Online (Sandbox Code Playgroud)
和此错误javac: …
我在使用 JNI 时遇到了一个非常奇怪的问题。有人可以帮我理解这里有什么问题吗?
如果我按原样运行下面的代码,我会看到:
(a) 7fb6f022faf0 7fb6f022fb00 0
(b) 7fb6f022faf8 7fb6f022fb00 1
Run Code Online (Sandbox Code Playgroud)
如果我取消注释标记为 的行// (*),那么我会得到:
(a) 7f6ce822faf0 7f6ce822fb08 1
(b) 7f6ce822fb00 7f6ce822fb08 1
Run Code Online (Sandbox Code Playgroud)
(*)注释掉该行(这应该是无操作!)Integer.class后Integer.class,使用Class.equals方法发现 的一个实例与 的另一个实例不相等。取消注释该行,java.lang.Integer在test1方法中查找了两次而不是一次,由于某种原因,现在Integer.class发现两个实例是相等的!(这是在 JDK 16 上。)
有没有搞错?我完全不明白这...
pkg/Test.java:
package pkg;
public class Test {
public static native void test0();
public static native void test1(Object... args);
public static void main(String[] args) throws Exception {
test0();
test1(7);
}
}
Run Code Online (Sandbox Code Playgroud)
test.c: …