小编Luk*_*son的帖子

如何获取未命名模块的Java 9 ModuleReference

更新:我在这里回答了我自己的问题:

在Java 9中运行时扫描类路径/模块路径

-

[旧问题 - 已过时:]

在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自动模块.我也找不到ModuleReferenceModule对象获取a的方法,这意味着Module如果模块是自动和/或未命名的,我无法列出资源.

当然必须有一种方法来获得ModuleReference一个给定的(已经加载)Module

java classpath java-9 java-module

6
推荐指数
1
解决办法
3094
查看次数

LambdaMetaFactory具有通用类型的具体实现

我试图使用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 lambda methodhandle java-9 lambda-metafactory

6
推荐指数
2
解决办法
423
查看次数

为什么泛型超类型的Java类型推断会在此处中断?

给出以下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)

表达式可以初始化listlist2并且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: …

java generics type-inference

6
推荐指数
1
解决办法
58
查看次数

为什么 JNI 的 FindClass 方法有奇怪的副作用?

我在使用 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.classInteger.class,使用Class.equals方法发现 的一个实例与 的另一个实例不相等。取消注释该行,java.lang.Integertest1方法中查找了两次而不是一次,由于某种原因,现在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: …

java java-native-interface jvm

2
推荐指数
1
解决办法
69
查看次数