在java中使用字符串作为命令

在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" );

我有一个名为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" );                                
        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"