我有一个采用功能参数的方法,例如a Runnable.由于它是一个库方法,我希望它使用从函数参数派生的记录器.调用getClass函数参数适用于普通类,我可以getEnclosingClass用于嵌套或匿名类; 但如果它是一个lambda表达式,它会返回一个含有的模糊名称$$Lambda$,我可以像这样手动剥离:
Class<?> type = runnable.getClass();
String canonical = type.getCanonicalName();
int lambdaOffset = canonical.indexOf("$$Lambda$");
if (lambdaOffset > 0) {
try {
type = Class.forName(canonical.substring(0, lambdaOffset));
} catch (ClassNotFoundException e) {
// strange, but we can stick to the type we already have
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样,这不是很优雅,也可能不便携.我试过getEnclosingClass,getEnclosingMethod和getEnclosingConstructor,但他们都返回null.
有任何想法吗?
我JUnit 5编写了一个测试类,Java它使用一个标为的字段@RegisterExtension,它工作得很好:
class RegisterExtensionTest {
@RegisterExtension
LoggingExtension log = new LoggingExtension(RegisterExtensionTest.class);
@Test void demoTest() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
当我将其转换为Kotlin时:
class RegisterExtensionTest {
@RegisterExtension
var log = LoggingExtension(RegisterExtensionTest::class.java)
@Test
fun demoTest() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在LoggingExtension不再运行了。为什么?
我创建了一个带有两个类的普通 Java 9 Maven 应用程序,以使用 JSON-B 测试 JSON 的序列化和反序列化。这是代码:
package com.jsonbdemos;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
public class App {
public static void main(String[] args) {
Jsonb jsonb = JsonbBuilder.create(new JsonbConfig());
String jsonData = "{\"creationDate\":\"2018-01-05\"}";
// Create Widget object from JSON string.
Widget widget = jsonb.fromJson(jsonData, Widget.class);
System.out.println("JSON => object: " + widget.toString());
// Serialize Widget object to JSON string.
String jsonFromObject = jsonb.toJson(widget);
System.out.println("object => JSON: " + jsonFromObject);
}
}
package com.jsonbdemos;
import java.time.LocalDate;
public class Widget …Run Code Online (Sandbox Code Playgroud) 为什么不java.time.Period实现java.lang.Comparable界面?
简单的问题,但答案可能不那么简单:其他常用的时间量java.time.Duration 确实实现Comparable,所以我假设设计师可能会考虑它,但决定反对它.
我有一个JAX-RS服务,可以在本地使用wildfly-swarm 1.0.0.Beta8,但是当我在远程机器上启动它时,我得到以下异常:
ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC000001: Failed to start service jboss.undertow.listener.default: org.jboss.msc.service.StartException in service jboss.undertow.listener.default: Could not start http listener
at org.wildfly.extension.undertow.ListenerService.start(ListenerService.java:142)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: Protocol family unavailable
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.xnio.nio.NioXnioWorker.createTcpConnectionServer(NioXnioWorker.java:190)
at org.xnio.XnioWorker.createStreamConnectionServer(XnioWorker.java:243)
at org.wildfly.extension.undertow.HttpListenerService.startListening(HttpListenerService.java:126)
at org.wildfly.extension.undertow.ListenerService.start(ListenerService.java:138)
... 5 more
Run Code Online (Sandbox Code Playgroud)
此外,当我将应用程序部署到完整的野生动物10时,它的工作正常.
我用谷歌搜索"协议族不可用"例外可能与只有IPv6地址的机器有关,而java默认为IPv4,但这台机器确实有一个IPv4地址.
我不知道我可能做错了什么.
有什么建议?
java ×4
comparison ×1
date ×1
json ×1
jsonb-api ×1
junit5 ×1
kotlin ×1
lambda ×1
wildfly ×1
wildfly-10 ×1