从Java 9升级到10后,链接到JDK不再工作时的Javadoc工具生成的文件(例如,对于文件导入java.util.Optional
,{@link Optional}
呈现为Optional
而不是作为Optional
;同一个问题有@see
,@param
,@return
,和其他地方,你通常看到的Javadoc链接).
我有一个简单的模块化项目,我使用Maven用的Javadoc插件(source
和target
选项设置10
在configuration
编译器插件部分).我的理解是,默认情况下它会传递-link https://docs.oracle.com/javase/10/docs/api/
给Javadoc工具.我的理解是,从历史上看,Javadoc工具期望一个名为的文本文件package-list
存在于被告知要查找外部文档的URL中.Java 8 有一个.Java 9 有一个.Java 10 没有(404错误).显然,Javadoc工具现在输出一个名为element-list
而不是package-list
模块化项目的文本文件,但似乎也没有提供(Java 9也没有提供,但它可用于早期访问的Java 11版本).
通过IntelliJ生成Javadoc并Link to JDK documentation
启用该选项会产生相同的结果.它说,它传递-link https://docs.oracle.com/javase/10/docs/api/
给javadoc.exe
,并报告javadoc: error - Error fetching URL: https://docs.oracle.com/javase/10/docs/api/
.尽管有错误,它确实输出了Javadoc,但与Maven一样,没有JDK链接.
这应该怎么样?当他们将JDK文档放到网上时,Oracle是否搞砸了?
我的相关部分pom.xml
:
<build>
<plugins>
<plugin> …
Run Code Online (Sandbox Code Playgroud) 有关如何使用匿名类同时保持与Allman缩进样式一致的任何建议?我真的不喜欢我想出的任何事情,例如
// Pass as parameter.
foo(new Clazz( )
{
// Do stuff.
});
// Assign to variable.
Clazz bar = new Clazz( )
{
// Do stuff.
};
Run Code Online (Sandbox Code Playgroud) 编辑:我最初接受了我的答案,但我并不满意,因为我想要正确使用泛型.所以,我一直在做研究并找到了解决方案.请在下面的答案中阅读相关内容.
这是一段自包含的Java代码,展示了我正在尝试做的事情.它可以正确编译,运行和运行.
1 import java.lang.reflect.Method;
2 import java.lang.reflect.InvocationTargetException;
3
4 public class Example
5 {
6 public static <T> void foo(Method method, String target, Object argument, T expectedReturn) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
7 {
8 T actualReturn = (T) method.invoke(target, argument);
9 System.out.print(actualReturn.equals(expectedReturn));
10 }
11
12 public static void main(String[ ] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
13 {
14 foo(String.class.getMethod("charAt", int.class), "test", 1, 'e');
15 }
16 }
Run Code Online (Sandbox Code Playgroud)
运行此打印true
到控制台,这是我所期望的.令我困扰的是,由于第8行的演员表,我在编译时会收到警告,如下所示(顺便说一句,jGRASP是我的IDE).
---- jGRASP exec:javac -g -Xlint:未选中Sandbox.java …
我理解为了实例化一个内部类(即非静态),你需要一个封闭类的实例.如果封闭类是抽象的(不要问),这会使事情变得复杂一些.考虑以下.
abstract class Outer {
class Inner {}
}
Run Code Online (Sandbox Code Playgroud)
Inner
例如,实例化仍然可以静态地使用,例如,匿名类,就像这样.
Inner instance = new Outer() {}.new Inner();
Run Code Online (Sandbox Code Playgroud)
但那么如何动态地完成同样的事情Constructor.newInstance
呢?(请注意,我动态地说;假设您不知道外部类的名称.)您需要根据JLS 15.9.3传递第一个参数的封闭类的实例,如果有办法的话为了满足抽象参数而动态创建东西,我不知道它(任何想法的奖励积分).
长话短说,我最终意外地传入null
,就像这样.
Constructor<Inner> constructor = Inner.class.getDeclaredConstructor(Outer.class);
Object argument = null;
Inner instance = constructor.newInstance(argument);
Run Code Online (Sandbox Code Playgroud)
想象一下,当有效时我会感到惊讶.我的问题是,为什么这样做?这会一直有效吗?
看看这个.
import java.lang.reflect.*;
import java.util.Arrays;
class Test {
class Inner {
public <T> Inner(T arg) {}
}
public static void main(String[] args) {
Constructor<?> constructor = Test.Inner.class.getConstructors( )[0];
System.out.println(
"Regular parameters: " +
Arrays.toString(constructor.getParameterTypes()) +
"\nGeneric parameters: " +
Arrays.toString(constructor.getGenericParameterTypes())
);
}
}
Run Code Online (Sandbox Code Playgroud)
运行此打印以下内容.
常规参数:[类Test,类java.lang.Object]
通用参数:[T]
我对Java内部类(即非静态)的理解是它们的构造函数隐式地为它们的封闭类提供了一个参数.因此,要获取实例Inner
,您可以像这样调用它的构造函数.
Test.Inner foo = new Test().new Inner(new Object());
Run Code Online (Sandbox Code Playgroud)
实际发生的是将实例Test
传递给构造函数Inner
(以及任何其他参数),并将其分配给隐式实例字段.
检查这个结构的nullary构造函数Inner
,因为调用getParameterTypes
返回一个包含Class
表示Test
和Object
(擦除T
)的对象的数组.
但是,由于构造函数是通用的,因此调用getGenericParameterTypes
将返回仅包含类型变量的数组T
.缺少封闭类的隐式参数.
只有当内部类构造函数声明一个类型变量时,才会发生这种情况.为什么这样做?这是一个错误吗?
这是为家庭作业分配一些给定的字符串.我正在提示用户他们想要排序scanf
的字符串数量,根据该数字分配一个数组,然后自己获取字符串fgets
.
如果字符串的数量是硬编码的,那么一切正常,但是scanf
让用户决定搞砸了.这是代码:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 20 // Maximum string length.
int main(void)
{
int index, numStrings = 0;
char **stringArray;
printf("Input the number of strings that you'd like to sort: ");
assert(scanf("%d", &numStrings) == 1);
stringArray = (char **)malloc(numStrings * sizeof(char *));
for (index = 0; index < numStrings; index++)
{
stringArray[index] = (char *)malloc(LENGTH * sizeof(char));
assert(stringArray[index] != NULL);
printf("Input string: ");
assert(fgets(stringArray[index], LENGTH, stdin) != NULL);
} …
Run Code Online (Sandbox Code Playgroud) 在Ceylon中有一种简单的方法可以创建一个无限的迭代,它通过调用相同的no-args函数来生成每个元素吗?换句话说,语言模块是否提供了与Java 8相同的功能Stream.generate(Supplier<T>)
?
因此,例如,StringBuilder
继承自抽象类AbstractStringBuilder
.据我了解,StringBuilder
本身没有字段(除了serialVersionUID
).相反,它的状态由字段表示,AbstractStringBuilder
并通过调用super
它覆盖的方法的实现来操纵.
是否有一种方法通过反射来获取声明的私有char
数组与特定的实例相关联?这是我得到的最接近的.value
AbstractStringBuilder
StringBuilder
import java.lang.reflect.Field;
import java.util.Arrays;
public class Test
{
public static void main(String[ ] args) throws Exception
{
StringBuilder foo = new StringBuilder("xyzzy");
Field bar = foo.getClass( ).getSuperclass( ).getDeclaredField("value");
bar.setAccessible(true);
char[ ] baz = (char[ ])bar.get(new StringBuilder( ));
}
}
Run Code Online (Sandbox Code Playgroud)
这让我得到了一个包含十六个空字符的数组.请注意,我正在寻找涉及反射的解决方案,因为我需要一种不限于此的通用技术StringBuilder
.有任何想法吗?