Java 从Method.invoke传递的变量不';除了System.out.println外,我什么都没出现
我要做的是在输入框中为我正在制作的游戏创建一个屏幕上显示的消息,如 “名称:(此处将显示输入)” 我所做的是传递消息,我希望输入指向哪个对象,以及哪个函数将使用变量(例如将输入设置为播放器名称的函数)。现在,我可以从InputBox对象访问输入变量,但从长远来看,这将更有效。我正在使用Java 从Method.invoke传递的变量不';除了System.out.println外,我什么都没出现,java,methods,invoke,Java,Methods,Invoke,我要做的是在输入框中为我正在制作的游戏创建一个屏幕上显示的消息,如 “名称:(此处将显示输入)” 我所做的是传递消息,我希望输入指向哪个对象,以及哪个函数将使用变量(例如将输入设置为播放器名称的函数)。现在,我可以从InputBox对象访问输入变量,但从长远来看,这将更有效。我正在使用方法。调用将函数传递到我想要的对象中,并将输入字符串作为参数。这是我的密码: public class InputBox extends Textbox { public String input = "
方法。调用将函数传递到我想要的对象中,并将输入字符串作为参数。这是我的密码:
public class InputBox extends Textbox {
public String input = "";
private String out;
private Object obj;
private int lastLastKey = 0;
/**
*
* @param message
* @param cl The object/class where the output variable is.
* @param out The method to run. Only takes the input variable, so use this format: void toRun(String input)
*/
public InputBox(String message, Object obj, String out) {
super(message);
this.out = out;
this.obj = obj;
}
public void tick(Game game){
if (game.input.lastKey != 0 && !game.input.keys[KeyEvent.VK_ENTER]
&& !game.input.keys[KeyEvent.VK_SPACE] && !game.input.keys[KeyEvent.VK_SHIFT] && !game.input.keys[KeyEvent.VK_BACK_SLASH]){
if(game.input.lastKey != lastLastKey) input+=Character.toUpperCase((char) game.input.lastKey);
}else if(game.input.keys[KeyEvent.VK_ENTER] && !input.isEmpty() && !cleared){
Method method = null;
try {
method = obj.getClass().getMethod(out, new Class[]{ String.class, Object.class });
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
try {
method.invoke(obj, new Object[]{ input, obj });
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
cleared = true;
}
lastLastKey = game.input.lastKey;
}
public void render(Graphics g){
if(!cleared){
g.setColor(Color.white);
g.fillRect(10, Display.height-110, Display.width-20, 100);
g.setColor(Color.black);
g.drawRect(10, Display.height-110, Display.width-20, 100);
g.setFont(Game.smallFont);
FontMetrics fm = g.getFontMetrics();
g.drawString(message+" "+input, Display.width/2-fm.stringWidth(message+" "+input)/2, Display.height-50);
}
}
}
您对构造函数的描述说,预期方法的签名为
void toRun(String input) {}
但您的反射代码会查找具有签名的方法
void toRun(String input, Object o) {}
如果您使用的是Java 8,则可以使用并删除所有反射代码:
public class InputBox extends Textbox {
private Consumer<String> out;
public InputBox(String message, Consumer<String> out) {
this.out = out;
...
}
public void tick(Game game){
...
out.apply(input);
...
}
}
您可以使用方法引用创建一个InputBox
public InputBox createNameInputBox(Player p) {
return new InputBox("Name: ", p::setName);
}
或者用lambda表达式
public InputBox createAlternateNameInputBox(Player p) {
return new InputBox("Name: ", name -> p.setName(name));
}
要阅读有关lambda表达式和方法引用的更多信息,请参阅Java教程系列()。有关是否应使用方法引用或lambda表达式的讨论,请参见您的问题是什么?我的问题是,每当我运行此代码时,变量都会按照我的要求传递给另一个类,但我唯一能做的就是使用System.out.print。其他变量也起作用,但这并不意味着我不明白这意味着什么。请您重新措辞,最好添加一个显示System.out.print
问题的文本。当我使用Method.invoke将变量输入传递给另一个类时,变量被正确接收。我做了一个System.out.println(输入),它产生了RYAN,这就是我输入的。但当我试图在实际屏幕上显示它时,它不会出现,但如果我使用另一个变量,它会出现。我还试着把它写到一个文件里;这也不起作用。我如何初始化消费者对象?@bloobchube为referenceThanks添加了示例代码和链接,这很有效!现在我终于可以继续发展我的游戏了。
public InputBox createAlternateNameInputBox(Player p) {
return new InputBox("Name: ", name -> p.setName(name));
}