更新:我在这里回答了我自己的问题:
-
[旧问题 - 已过时:]
在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文件而生成的自动(因此未命名)模块,您无法获取ModuleReference
from 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
: …