在java中使用字符串作为命令
我有一个名为var的字符串,其中文本字符串设置为doc1、doc2或doc3在java中使用字符串作为命令,java,string,switch-statement,jsoup,Java,String,Switch Statement,Jsoup,我有一个名为var的字符串,其中文本字符串设置为doc1、doc2或doc3 String var = "doc2" // doc1 or doc2 or doc3 我通过这种方式使用Jsoup从网站获取内容 Document doc_comp = Jsoup.connect("http://www.computer.org").get(); Elements doc1_comp = doc_comp.select("ul > doc1" );
String var = "doc2" // doc1 or doc2 or doc3
我通过这种方式使用Jsoup从网站获取内容
Document doc_comp = Jsoup.connect("http://www.computer.org").get();
Elements doc1_comp = doc_comp.select("ul > doc1" );
Elements doc2_comp = doc_comp.select("ul > doc2" );
Elements doc3_comp = doc_comp.select("ul > doc3" );
我使用开关盒打印相应的值
switch(var)
{
case "doc1": System.out.println(doc1_comp.text());
break;
case "doc2":System.out.println(doc2_comp.text());
break;
case "doc3":System.out.println(doc3_comp.text());
break;
default: System.out.println("no info");
}
开关盒的一切工作都很好,但我想用一行代码来替换这样的开关盒
System.out.println(var.concat("_comp.text()"));
但它直接打印为字符串var_comp.text,但不执行它并打印其中的内容
有没有办法让它运行您可以使用三元运算符将switch语句替换为一行代码,但使用三元运算符并不能使它比switch语句更快或更高效
样本:
我认为switch语句实际上是最好的选择。但是如果你真的想执行字符串内容,
您可以通过使用轻量级脚本框架(如java脚本或bean shell)来实现它
我会劝阻它使用java实现一些功能,
但在某些情况下,使用脚本框架
因为确实需要胶水
请参见下面使用javascript的示例:
package com.demo.test;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class ScriptTest {
public static void main(String[] args) throws ScriptException {
ScriptEngine jse = new ScriptEngineManager()
.getEngineByName("javascript");
Bindings bindings = jse.getBindings(ScriptContext.ENGINE_SCOPE);
ScriptTest test = new ScriptTest();
bindings.put("test", test);
String preFix = "demo";
jse.eval("test." + preFix + "_test()");
preFix = "actual";
jse.eval("test." + preFix + "_test()");
}
public void demo_test() {
System.out.println("demo test");
}
public void actual_test() {
System.out.println("actual test");
}
}
这当然不是单行解决方案,因为它需要脚本
要设置的环境。此外,还需要注意在两个上下文中传递对象
注意:这将严重影响性能。执行命名空间切换代价高昂
就我个人而言,我更喜欢beanshell而不是javascript,它的性能要好一点,但是你需要包含它的依赖JAR,尽管占用空间小,而javascript是开箱即用的。你可以直接在doc\u comp.select方法和System.out.println方法中使用var。例如:
String var = "doc2" // doc1 or doc2 or doc3
Document doc_comp = Jsoup.connect("http://www.computer.org").get();
Elements doc_comp_var = doc_comp.select("ul > " + var);
System.out.println(doc_comp_var.text());
您可以使用反射,但它的性能不是很好,通常会增加复杂性并降低代码的安全性
我可能误解了您想要实现的目标,但我认为将所有文档元素放入HashMap是最简单的。它不会产生一行代码,但是它的性能比反射更好,并且使代码更简洁。像这样:
Document doc_comp = Jsoup.connect("http://www.computer.org").get();
Map<String, Elements> map = new HashMap<>();
for(int i=1; i < 4; ++i) {
map.put("doc" +i+ "_comp", doc_comp.select("ul > doc"+i) );
}
通常,如果您希望基于字符串分派某些方法并希望避免反射,那么一种合理的方法是设计一个接口,将实现该接口的类实例放入映射中,并执行映射查找以执行分派
即
然后,可能在应用程序启动期间创建分派映射:
Map<String, MyInterface> dispatchMap = new HashMap<>();
dispatchMap.put("thingA", new A());
dispatchMap.put("thingB", new B());
dispatchMap.put("thingX", new A()); // etc...
稍后的客户端代码可以使用您的分派机制动态执行方法:
doSomethingBasedOnString("thingB"); // outputs: "do something class B"
您期望的结果是什么?我需要打印doc1_comp的HTML文本内容。@user1364432所以基本上,您有一个字符串,其中包含一个方法调用的文本。在本例中,docX_comp.text,其中X是一个数字,您希望执行该方法,而不仅仅是打印字符串?是的,完全正确。我想执行这个方法。@user1364432所以你想用一行代码代替switch来执行它吗?
public interface MyInterface {
public void doSomething();
}
public class A implements MyInterface {
@Override
public void doSomething() {
System.out.println("do something class A");
}
}
public class B implements MyInterface {
@Override
public void doSomething() {
System.out.println("do something class B");
}
}
Map<String, MyInterface> dispatchMap = new HashMap<>();
dispatchMap.put("thingA", new A());
dispatchMap.put("thingB", new B());
dispatchMap.put("thingX", new A()); // etc...
public void doSomethingBasedOnString(String thingName) {
MyInterface code = dispatchMap.get(thingName);
if( code != null ) {
code.doSomething();
}
else {
// dynamic code lookup failed
}
}
doSomethingBasedOnString("thingB"); // outputs: "do something class B"