英文:
Java - way to prevent Collections Framework use for assignment?
问题
对于特定的作业(使用Java),我让我的学生实现一些抽象数据类型(ADTs),并且我不允许他们使用我们之前讲过的任何Java集合框架(如List、Collections、LinkedList、Stack、Deque等)。
有哪些好的方法来强制/检测这个限制,以确保他们在这个特定的作业中不使用这些接口和类?
是否有编译器指令/开关/设置可以完全阻止使用java.util
?我的意思是,这会相当严格,但到目前为止,这个作业只需要使用java.lang
就可以完成。我本来想使用Iterator
,而且他们需要使用泛型。
我本来打算检测import
语句,但反射无法从字节码中获取这些信息。有篇帖子建议在源文件中使用QDox来获取导入语句,但我不想为此加载额外的库。我是否应该编写一个脚本来扫描他们的源文件,查找java.util.x
的导入?
我在考虑使用反射来查看他们的类文件,以查看是否有任何成员属于那些类型列表... 但有点混乱 :/
由于学生人数较多,我大部分作业都是自动评分/单元测试的,尽管在某些作业中我会查看所有代码,以给他们额外的反馈。所以目前,我必须在这个作业上这样做,只是为了找出那些没有遵循指示的人。
只是好奇你们中有些人会为此做些什么。
英文:
For a particular assignment (in Java), I'm having my students implement some ADTs, and I am preventing them from using any of the Java Collections Framework that we have covered previously (List, Collections, LinkedList, Stack, Deque, etc.).
What are some good ways to enforce / detect this restriction to make sure they are not using these interfaces and classes for this particular assignment?
Is there a compiler directive / switch / setting to prevent usage of java.util
entirely? I mean, that's some serious hobbling, but for this assignment so far it can get by on just java.lang
. I would have liked to used Iterator
, and they need to have Generics.
I was going to try to detect import
statements, but reflection can't get those from the byte code. One post suggested QDox on source files for getting imports, but I didn't want to load an additional library for this. Should I just write a script to scan their source files for java.util.x
imports?
I was thinking of looking at their class files with reflection to see if any members where of those list of types... but kinda messy :/
Most of my assignments are auto-graded / unit-tested because of the number of students, though for some assignments I peek at all the code to give them additional feedback. So for now, I have to do that on this one just to catch those who didn't follow directions.
Just curious what some of you would do for this.
答案1
得分: 4
有许多可用的依赖性分析工具,但如果您使用的是较新的JDK,jdeps
(自JDK 8起的一部分)可能已经足够满足您的需求。
例如:
$ jdeps -verbose:class -p java.util ~/opt/antlrworks/antlrworks-1.5.2-complete.jar
列出了对java.util.*
类的依赖关系。可以很容易地从一个小的Shell脚本或类似脚本中调用它,以进行自动检查。
通过使用反射(Class.forName
...)绕过检测并不是不可能,但是如果您的任何学生设法/知道如何做到这一点,无论如何都值得给予奖励积分。
更多信息在这里:https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
英文:
There are a bunch of dependency analysers available, but if you are using a recent JDK, jdeps
(part of the JDK since 8) might be sufficient for your needs.
For example:
$ jdeps -verbose:class -p java.util ~/opt/antlrworks/antlrworks-1.5.2-complete.jar
lists the dependencies on java.util.*
classes. Should be easy to call it from a small shell script or similar for automatic checking.
It is not impossible to get around detection by using reflection (Class.forName
...), but if any of your students manage/know how to do this, they deserve a bonus point anyway.
More info is available here: https://wiki.openjdk.java.net/display/JDK8/Java+Dependency+Analysis+Tool
答案2
得分: 2
一种解决方法是利用checkstyle,并启用'IllegalImport'规则。https://checkstyle.sourceforge.io/config_imports.html#IllegalImport
只需将要禁止的类添加到列表中,如果它们出现在代码中,构建将失败。
英文:
One solution to this would be to make use of checkstyle, and turn on the 'IllegalImport' rule. https://checkstyle.sourceforge.io/config_imports.html#IllegalImport
Simply add the classes you want to disallow to the list, and if they are present in the code, the build will fail.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论