1

I know there is a term for this, but it escapes me at the moment. Basically, i have something like this:

private static final Map<String, String> myMap = new HashMap<Integer, String>();
    static {
        myMap.put("one", "one text");
        myMap.put("two", "two text");
    }

instead of accessing the map with the standard

myMap.get("one");

is there any way I can use reflection or something else so i can access the string like this

myMap.one;

I know its possible in other languages, not sure if anyone figured out how to do with in java yet. The way the current system is designed, interfaces are really impractical and would end up being even more of a mess than what im dealing with right now. Its not a big deal, but it would simplify synchronizing keys across multiple classes and systems.

thanks

4

6 回答 6

6

不。Java 是一种静态类型的语言,并且Map没有one成员......所以这将无法编译。

使用常量作为键 - 甚至可能是枚举 - 以避免拼写错误的风险,并且只使用正常的Map方法。Java 没有在语言级别为您提供任何替代方案。

于 2013-07-29T18:26:29.853 回答
1

不,这对于普通的 java 是不可能的。原因是,java 在编译时进行了完全类型检查,因此任何类型/成员信息都必须可用。由于您的数据是运行时信息,因此编译器无法推断它们并且不会编译。

如果密钥是固定的并且已知程序时间,您可以使用枚举:

MyEnum.one

那么是可能的。例如:

MyEnum.one.getValue()

其中 value() 是一个抽象方法,可以被枚举常量覆盖。

于 2013-07-29T18:26:37.160 回答
0

我怀疑这真的是你要找的东西,但以防万一。我认为它不适用于 Java 1.6 或更早版本。

package test;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

import sun.org.mozilla.javascript.internal.Context;

public class HashMapStuff {

    private static final Map<String, String> myMap = new HashMap<String, String>();
    static {
        myMap.put("one", "one text");
        myMap.put("two", "two text");
    }

    public static void main(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        Context.enter().getWrapFactory().setJavaPrimitiveWrap(false);
        engine.put("myMap", myMap);
        PrintWriter writer = new PrintWriter(System.out);
        engine.getContext().setWriter(writer);
        try {
            engine.eval("function MyMapWrapperClass() {};MyMapWrapperClass.prototype.__noSuchMethod__ = function(arg){ return (myMap.get(arg)) };myMapWrapper = new MyMapWrapperClass();");
        } catch (ScriptException e1) {
            e1.printStackTrace();
        }
        try {
            engine.eval("mappedValue = myMapWrapper.one();");
        } catch (ScriptException e1) {
            e1.printStackTrace();
        }
        System.out.println(engine.get("mappedValue"));
        try {
            engine.eval("mappedValue = myMapWrapper.two();");
        } catch (ScriptException e1) {
            e1.printStackTrace();
        }
        System.out.println(engine.get("mappedValue"));
    }

}

输出:

one text
two text
于 2013-07-29T20:06:43.130 回答
0

它不是“纯 java”,但你可以用 Groovy 做你想做的事情,它确实在 JVM 上运行。

于 2013-07-30T19:38:06.963 回答
0

你可以做这样的事情。如果有很多地图条目,它会变得相当笨拙,但可能会在数量有限的情况下工作。

import java.util.HashMap;
import java.util.Map;

public class MethodMap {

    private static final Map<String, String> internalMap;

    static {
        internalMap = new HashMap<String, String>();
        internalMap.put("one", "one text");
        internalMap.put("two", "two text");
    }

    public static String one = internalMap.get("one");

    public static String two = internalMap.get("two");

}

编辑添加:再考虑问题,您可以编写一个 Java 应用程序来读取 Map<String, String> 并生成此类作为输出。使用方法映射代码生成器,这种结构对于大量映射行是实用的。

我在我的 Java 文章Writing Java Code that Writes Java Code中展示了如何做到这一点。

于 2013-07-29T18:33:22.437 回答
0

如果你不想使用常规的字符串作为键,也许最好使用下面的 Map

private static Map<Integer, String> mymap = new HashMap<>();

并带有以下界面

public static void set(Integer key, String value)
{
    mymap.put(key, value);
}

public static String get(Integer key)
{
    mymap.get(key);
}
于 2013-07-29T18:27:22.143 回答