有没有办法在Java中实现这种代码?
int foo = 3;
String data = "foo";
System.out.println(StringToReference(data));
并打印3
?
修改:具体来说,我想解析String
或char
并返回代表int
的{{1}}。例如,我希望能够这样做:
KeyEvent
答案 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)。并且H
和h
都对应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反射。
Class<?> c = Class.forName("YOUR_CLASS_NAME");
Field f = c.getField("FOO");
System.out.println(f.getInt());