在Java中传递String引用

时间:2013-05-23 19:19:42

标签: java string reference

有没有办法在Java中实现这种代码?

int foo = 3;
String data = "foo";
System.out.println(StringToReference(data));

并打印3

修改:具体来说,我想解析Stringchar并返回代表int的{​​{1}}。例如,我希望能够这样做:

KeyEvent

6 个答案:

答案 0 :(得分:6)

如果不知道你想要完成什么,这是我认为你能得到的最接近的:

Map<String, Integer> map = new HashMap<String, Integer>();

map.put("foo", 3);

System.out.println(map.get("foo"));

答案 1 :(得分:2)

通常,在Java中,您不能按名称引用变量(作为字符串,在运行时; Perl调用&#34;软引用&#34;)。 但在某些情况下(字段,而不是局部变量),您可以通过反射获得类似的行为。

出于您的意图,您可以这样做:

public static int getKeyEventVK(char c) throws 
                      IllegalArgumentException, SecurityException, 
                      IllegalAccessException, NoSuchFieldException {
    return KeyEvent.class.getField("VK_" + 
               String.valueOf(c).toUpperCase()).getInt(null);

}

public static void main(String[] args) throws Exception{
    System.out.println(getKeyEventVK('h'));
    System.out.println(KeyEvent.VK_H);
}       

但请记住,键入的字符串可以触发多个VK_ *事件(例如,shift)。并且Hh都对应VK_H,因此这不会完全模仿通过键入字符串hello触发的事件(更不用说非字母数字字符,死键,退格等等)

答案 2 :(得分:1)

以下是如何使用反射执行此操作:

char c = "C";
Robot rob = new Robot();
Field field = KeyEvent.class.getDeclaredField("VK_"+c);         
int i = field.getInt(null);
rob.keyPress(i);

答案 3 :(得分:1)

我明白你要做什么。没有其他答案是正确的。

您希望获得给定字符的“正确”KeyEvent常量,并且您希望这样做而不必编写某种长达数万行的查找表。

确实,反思会帮助你。这将是相当慢的。但它会完成这项工作。这份工作是否真的需要做是另一个问题。 : - )

您想要的功能可能是这样的:

/**
 * If possible, returns an {@code int} equal to one of the {@code public
 * static final int} constants present in the {@link KeyEvent} class
 * whose names start with {@code VK_}.
 *
 * <p>This implementation does no error handling whatsoever and has not
 * been tested or compiled.</p>
 * 
 * <p>This method is placed explicitly in the public domain.</p>
 *
 * @param c the character to use while searching for a field; no attempt
 * will be made by this implementation to validate it in any way
 *
 * @return a {@link KeyEvent} constant whose name starts with {@code VK_}
 *
 * @exception Exception for any of a number of possible reasons
 */
public int getKeyEventConstant(final char c) throws Exception {
  final Field field = KeyEvent.class.getField(String.format("VK_%S", Character.valueOf(c)));
  assert field != null;
  return field.getInt(null);
}

然后,您可以像下面这样提供它,但如果提供的String包含字符,您将遇到各种问题,我上面描述的函数不会被编辑以正确处理异常:

public  toKeyEventCodes(final String s) {
  int[] returnValue = null;
  if (s != null && !s.isEmpty()) {
    final Collection<Integer> codes = new ArrayList<Integer>(s.length());
    final char[] chars = s.toCharArray();
    assert chars != null;
    assert chars.length > 0;
    for (final char c : chars) {
      if (!Character.isWhitespace(c)) { // TODO: weed out other obvious dumb chars
        codes.add(Integer.valueOf(getKeyEventConstant(c)));
      }
    }
    returnValue = codes.toArray(new int[codes.size()]);
  }
  if (returnValue == null) {
    returnValue = new int[0];
  }
  return returnValue;
}

所有这些代码都未经过测试。祝好运。我猜你还有一些过于复杂的事情,但希望这会让你指向正确的方向。

答案 4 :(得分:0)

您可以使用以下代码:

int foo = 3;
String data = Integer.toString(foo);

这将允许int存储在String文件中。我想你可以将它传递给你的方法并从中返回你想要的任何东西。

虽然上面的代码可以使用,但我不确定你什么时候使用它。

答案 5 :(得分:-1)

您可以使用java反射。

Reflection for field

       Class<?> c = Class.forName("YOUR_CLASS_NAME");
       Field f = c.getField("FOO");
       System.out.println(f.getInt());