我想编写一个Java框架,支持JRE7
作为基线,但如果在JRE8
(向上兼容?)的上下文中运行,则利用JRE8
的功能。
(或者我可能搞反了...即JRE8
是基线,但会优雅地降级以支持JRE7
)。
Java提供了一种方法来实现这一点吗?
我的尝试/示例:
我认为我可以采用类似于JavaScript特性检测的方式来解决此问题,即通过编程测试我的Java8
方法是否存在,如果存在则编程调用它,否则回退到Java7
库。
在我看来,这是一种非常艰难的方法。如果这种“功能切换/检测”可以由Java Runtime Environment
/ Java Compiler
处理,那就太好了。这是可能的,还是我在吃错药了?
免责声明:我没有解决编译问题,这将排除此解决方案的有用性(如果我使用Java7
进行编译,则无法向编译后的类添加-parameters
)。
public class Index {
void tellme(String yourname) {
/* ... */
}
public static void main(String[] args) throws Exception {
Method tellme = Index.class.getDeclaredMethod("tellme", String.class);
Method java8Params = null;
try {
java8Params = Method.class.getMethod("getParameters");
} catch (NoSuchMethodException t) { /* ignore */ }
if (java8Params != null) {
// java 1.8 !!
Object param = ((Object[]) java8Params.invoke(tellme))[0];
System.out.printf("(java8) %s %s(%s %s){/*...*/}",
tellme.getReturnType(),
tellme.getName(),
param.getClass().getMethod("getType").invoke(param),
param.getClass().getMethod("getName").invoke(param));
} else {
// java 1.7 ...
System.out.printf("(java7) %s %s(%s %s){/*...*/}",
tellme.getReturnType(),
tellme.getName(),
tellme.getParameterTypes()[0].getName(),
"arg0");
}
}
}