问题描述:独立编译2个jar文件,而不必在classpath中包含对方;并在运行时将两者都包含并在一个jar中调用main()以在stdout上打印字符串。输出字符串的一部分必须来自第二个jar。带Java注释的“Hello World”
约束条件:该解决方案不能依赖于IDE或使用任何其他jar文件。
回答我到目前为止所做的工作:我的解决方案如下所述。
问题的原因:我试图弄清楚/如何使用注释来解决这个问题(希望以更优雅的方式),但找不到任何合适的文档或教程。我也很欣赏任何指针。
我的解决方案:一个批处理文件(在Unix上,请更改反斜杠斜杠,分号冒号和REM对#)如下:
rem Compile and package the testing class (Main) without any library
javac -d target core\*.java
cd target
jar cvf ..\main.jar .\core
cd ..
rem Compile and package the Greeting and Greeted classes as a library
javac -d lib impl\*.java
cd lib
jar cvf ..\mylib.jar .\impl
cd ..
rem Use the two parts above at runtime and execute main() in Main class
java -cp main.jar;mylib.jar core.Main
有2个文件中IMPL目录2在核心,如下所示:
/*文件:IMPL/Greeting.java */
package impl;
public class Greeting {
public String getGreeting() {
return "Hello";
}}
/*文件:IMPL/Greeted.java */
package impl;
public class Greeted {
public String getGreeted() {
return "world";
}
/*文件:核心/ Main.java */
package core;
public class Main {
private String greeting = "Learn annotations", greeted = "keep using Java",
// Can read the following 4 values from a configuration file, too
// Trying to see if we can get these using Java annotations
greetingClassName = "impl.Greeting", greetingMethod = "getGreeting",
greetedClassName = "impl.Greeted", greetedMethod = "getGreeted";
public Main() {
try {
MyRunTime runTime = new MyRunTime();
Object gting = runTime.getInstance(greetingClassName),
gted = runTime.getInstance(greetedClassName),
g1Str = runTime.getResponseNoArg (gting, greetingMethod),
g2Str = runTime.getResponseNoArg (gted, greetedMethod);
if (g1Str instanceof String) greeting = (String) g1Str;
if (g2Str instanceof String) greeted = (String) g2Str;
} catch (Exception ex) {
System.err.println ("Error in Library loading: " + ex.getMessage());
}}
public void greet() {
System.out.println (greeting + ", " + greeted + "!");
}
public static void main (String[] args) {
new Main().greet();
}}
/*文件:核心/ MyRunTime.java */
package core;
import java.lang.reflect.*;
public class MyRunTime {
public Object getResponseNoArg (Object anInstance, String methodName) throws
NoSuchMethodException,
IllegalAccessException,
InvocationTargetException {
Method method = anInstance.getClass().getMethod (methodName);
return method.invoke (anInstance);
}
public Object getInstance (String className) throws
ClassNotFoundException,
InstantiationException,
IllegalAccessException {
Class c = Class.forName (className);
return c.newInstance();
}
}
就是这样。除非绝对必要,否则我也不想弄乱ClassLoader。一旦我掌握了如何使用注释执行此操作,我可以查看传递的参数并继续前进。感谢您的帮助。
你说,“我试图找出是否/如何使用注释来解决这个问题。”为什么?关于注释的含义是什么使得您想要将它们用于描述的问题?这是功课吗?有没有*额外的*方向,你没有给我们? – rfeak 2012-01-14 22:14:06
为什么?询问头脑想知道。还有什么...?不知何故,我所使用的大多数框架都使用注释来进行依赖注入/ IoC /无论你怎么称呼它。这些框架的创造者无疑是聪明的人,我试图理解他们的逻辑。不,这不是任何作业。其他指示:我不确定你的意思,但我所描述的几乎是一个完整的描述。从你的评论中,我应该假设答案是“注释与描述的问题无关”? – 2012-01-14 22:52:09
是的,那将是我的意见。我不认为注释会增加很多解决问题描述的方式。我见过的大多数Annotation用法都涉及到为类定义额外的*行为,而不是如何定位它。 – rfeak 2012-01-15 09:10:29