通用断言失败
Generic assertion failing
我在 Java 中有一个简单的通用静态方法,对于具有私有构造函数的 class 失败。方法如下:
public static <E> void assertThatCtorIsPrivate(Class<E> clazz, Class<?>... parameters) throws NoSuchMethodException, InstantiationException, IllegalAccessException {
Preconditions.checkNotNull(clazz);
final Constructor<?> constructor = clazz.getConstructor(parameters);
constructor.setAccessible(true);
try {
constructor.newInstance((Object[]) null);
} catch(InvocationTargetException e) {
if(e.getCause() instanceof UnsupportedOperationException) {
throw new UnsupportedOperationException();
}
} finally {
constructor.setAccessible(false);
}
assert Modifier.isPrivate(constructor.getModifiers());
}
这是我要测试的class:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import com.google.common.base.Preconditions;
import com.google.gson.Gson;
public final class DecodeJson {
private static final Gson GSON = new Gson();
private DecodeJson() {
throw new UnsupportedOperationException();
}
public static <E> E parse(final File file, Class<E> clazz) throws IOException {
Preconditions.checkNotNull(file);
Preconditions.checkArgument(file.exists() && file.canRead());
return GSON.fromJson(new FileReader(file), clazz);
}
public static <E> E parse(final String content, Class<E> clazz) throws IOException {
Preconditions.checkNotNull(content);
Preconditions.checkArgument(content.length() != 0);
return GSON.fromJson(content, clazz);
}
}
在我的单元测试中,我只有:
@Test(expected = UnsupportedOperationException.class)
public void testPrivateCtor() throws NoSuchMethodException, InstantiationException, IllegalAccessException {
ReflectionHelper.assertThatCtorIsPrivate(DecodeJson.class);
}
当我打电话给 final Constructor<?> constructor = clazz.getConstructor(parameters);
时收到 NoSuchMethodException
。我试过用 ?
代替 E
但仍然没有骰子。有什么见解吗?
Class.getConstructor(Class<?>... parameterTypes)
只会 return 个可访问的构造函数。
private
构造函数肯定不能从外部访问。
要获取不可访问的构造函数,请使用Class.getDeclaredConstructor(Class<?>... parameterTypes)
。
我在 Java 中有一个简单的通用静态方法,对于具有私有构造函数的 class 失败。方法如下:
public static <E> void assertThatCtorIsPrivate(Class<E> clazz, Class<?>... parameters) throws NoSuchMethodException, InstantiationException, IllegalAccessException {
Preconditions.checkNotNull(clazz);
final Constructor<?> constructor = clazz.getConstructor(parameters);
constructor.setAccessible(true);
try {
constructor.newInstance((Object[]) null);
} catch(InvocationTargetException e) {
if(e.getCause() instanceof UnsupportedOperationException) {
throw new UnsupportedOperationException();
}
} finally {
constructor.setAccessible(false);
}
assert Modifier.isPrivate(constructor.getModifiers());
}
这是我要测试的class:
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import com.google.common.base.Preconditions;
import com.google.gson.Gson;
public final class DecodeJson {
private static final Gson GSON = new Gson();
private DecodeJson() {
throw new UnsupportedOperationException();
}
public static <E> E parse(final File file, Class<E> clazz) throws IOException {
Preconditions.checkNotNull(file);
Preconditions.checkArgument(file.exists() && file.canRead());
return GSON.fromJson(new FileReader(file), clazz);
}
public static <E> E parse(final String content, Class<E> clazz) throws IOException {
Preconditions.checkNotNull(content);
Preconditions.checkArgument(content.length() != 0);
return GSON.fromJson(content, clazz);
}
}
在我的单元测试中,我只有:
@Test(expected = UnsupportedOperationException.class)
public void testPrivateCtor() throws NoSuchMethodException, InstantiationException, IllegalAccessException {
ReflectionHelper.assertThatCtorIsPrivate(DecodeJson.class);
}
当我打电话给 final Constructor<?> constructor = clazz.getConstructor(parameters);
时收到 NoSuchMethodException
。我试过用 ?
代替 E
但仍然没有骰子。有什么见解吗?
Class.getConstructor(Class<?>... parameterTypes)
只会 return 个可访问的构造函数。
private
构造函数肯定不能从外部访问。
要获取不可访问的构造函数,请使用Class.getDeclaredConstructor(Class<?>... parameterTypes)
。