Skip to content

Commit 0c7156c

Browse files
committed
CommandInfo: flag abstract classes as invalid
An abstract class cannot be instantiated, even by reflection. So there will be grievous problems when it comes time to instantiate the command, which will manifest with the following cryptic stack trace: [ERROR] Cannot create module: foo.Bar org.scijava.module.ModuleException: org.scijava.InstantiableException: java.lang.InstantiationException at org.scijava.command.CommandModule.instantiateCommand(CommandModule.java:250) at org.scijava.command.CommandModule.<init>(CommandModule.java:96) at org.scijava.command.CommandInfo.createModule(CommandInfo.java:330) at org.scijava.module.DefaultModuleService.createModule(DefaultModuleService.java:156) ... Caused by: org.scijava.InstantiableException: java.lang.InstantiationException at org.scijava.plugin.PluginInfo.createInstance(PluginInfo.java:307) at org.scijava.command.CommandInfo.createInstance(CommandInfo.java:250) at org.scijava.command.CommandModule.instantiateCommand(CommandModule.java:247) ... 17 more Caused by: java.lang.InstantiationException at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at java.lang.Class.newInstance(Class.java:433) at org.scijava.plugin.PluginInfo.createInstance(PluginInfo.java:302) ... 19 more Let's head off future confusion by marking abstract classes as invalid.
1 parent afbcf64 commit 0c7156c

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/main/java/org/scijava/command/CommandInfo.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,12 @@ private synchronized void initParams() {
439439
/** Processes the given class's @{@link Parameter}-annotated fields. */
440440
private void checkFields(final Class<?> type) {
441441
if (type == null) return;
442+
443+
// NB: Reject abstract classes.
444+
if (Modifier.isAbstract(type.getModifiers())) {
445+
problems.add(new ValidityProblem("Delegate class is abstract"));
446+
}
447+
442448
final List<Field> fields =
443449
ClassUtils.getAnnotatedFields(type, Parameter.class);
444450

src/test/java/org/scijava/command/InvalidCommandTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,18 @@ public void testInvalid() {
8181

8282
final List<ValidityProblem> problems = info.getProblems();
8383
assertNotNull(problems);
84-
assertEquals(2, problems.size());
84+
assertEquals(3, problems.size());
8585

8686
final String p0 = problems.get(0).getMessage();
87-
assertEquals("Invalid duplicate parameter: private int "
88-
+ "org.scijava.command.InvalidCommandTest$InvalidCommand.x", p0);
87+
assertEquals("Delegate class is abstract", p0);
8988

9089
final String p1 = problems.get(1).getMessage();
90+
assertEquals("Invalid duplicate parameter: private int "
91+
+ "org.scijava.command.InvalidCommandTest$InvalidCommand.x", p1);
92+
93+
final String p2 = problems.get(2).getMessage();
9194
assertEquals("Invalid final parameter: private final float "
92-
+ "org.scijava.command.InvalidCommandTest$InvalidCommand.y", p1);
95+
+ "org.scijava.command.InvalidCommandTest$InvalidCommand.y", p2);
9396
}
9497

9598
// -- Helper classes --

0 commit comments

Comments
 (0)