if(!"down".equals(direction)){ direction="up"; img= GameUtils.upImg; } public class GameUtils { //蛇头 Class clazz = getClass(); public Image upImg = Toolkit.getDefaultToolkit().getImage(clazz.getResource("img/up.png"));} 使这段代码能够正常运行且不改变原有的反射机制
时间: 2024-02-14 17:07:15 浏览: 22
为了使这段代码能够正常运行且不改变原有的反射机制,可以将GameUtils类中的upImg变量改为static类型,这样就不需要通过反射机制获取该变量,而是可以直接通过类名访问。修改后的代码如下:
```
if(!"down".equals(direction)) {
direction = "up";
img = GameUtils.upImg;
}
public class GameUtils {
//蛇头
public static Image upImg = Toolkit.getDefaultToolkit().getImage(GameUtils.class.getResource("img/up.png"));
}
```
这样就可以正常运行代码,并且不会改变原有的反射机制。
相关问题
package com.hh.utils; import java.awt.*; import java.lang.reflect.Field; public class GameUtils { //蛇头 public static Image upImg=Toolkit.getDefaultToolkit().getImage("img/up.png"); public static Image downImg=Toolkit.getDefaultToolkit().getImage("img/down.png"); public static Image leftImg=Toolkit.getDefaultToolkit().getImage("img/left.png"); public static Image rightImg=Toolkit.getDefaultToolkit().getImage("img/right.png"); //蛇身 public static Image bodyImg=Toolkit.getDefaultToolkit().getImage("img/body.png"); //食物 public static Image foodImg=Toolkit.getDefaultToolkit().getImage("img/food.png"); //关卡 public static int level= 1; //绘制文字 public static void drawWord(Graphics g,String str,Color color,int size,int x,int y){ g.setColor(color); g.setFont(new Font("宋体",Font.BOLD,size)); g.drawString(str, x, y); } }将这段代码用反射机制改写,并且在 以下方法内能够调用图片if(!"down".equals(direction)){ direction="up"; img= GameUtils.upImg; }
可以使用反射机制来动态地获取和设置类中的字段值,可以将原来的直接引用图片的方式改为通过反射获取图片对象。
以下是代码示例:
```java
package com.hh.utils;
import java.awt.*;
import java.lang.reflect.Field;
public class GameUtils {
//蛇头
public static Image upImg;
public static Image downImg;
public static Image leftImg;
public static Image rightImg;
//蛇身
public static Image bodyImg;
//食物
public static Image foodImg;
//关卡
public static int level = 1;
static {
// 使用反射初始化图片对象
try {
Field field = GameUtils.class.getDeclaredField("upImg");
field.setAccessible(true);
field.set(null, Toolkit.getDefaultToolkit().getImage("img/up.png"));
field = GameUtils.class.getDeclaredField("downImg");
field.setAccessible(true);
field.set(null, Toolkit.getDefaultToolkit().getImage("img/down.png"));
field = GameUtils.class.getDeclaredField("leftImg");
field.setAccessible(true);
field.set(null, Toolkit.getDefaultToolkit().getImage("img/left.png"));
field = GameUtils.class.getDeclaredField("rightImg");
field.setAccessible(true);
field.set(null, Toolkit.getDefaultToolkit().getImage("img/right.png"));
field = GameUtils.class.getDeclaredField("bodyImg");
field.setAccessible(true);
field.set(null, Toolkit.getDefaultToolkit().getImage("img/body.png"));
field = GameUtils.class.getDeclaredField("foodImg");
field.setAccessible(true);
field.set(null, Toolkit.getDefaultToolkit().getImage("img/food.png"));
} catch (Exception e) {
e.printStackTrace();
}
}
//绘制文字
public static void drawWord(Graphics g, String str, Color color, int size, int x, int y) {
g.setColor(color);
g.setFont(new Font("宋体", Font.BOLD, size));
g.drawString(str, x, y);
}
}
```
在调用图片的地方可以直接使用类中已经初始化好的字段对象,例如:
```java
if (!"down".equals(direction)) {
direction = "up";
img = GameUtils.upImg;
}
```
解释一下 double cnt=0; if(!s1.equals("")&&!s2.equals("")){ double d1=Double.parseDouble(s1); double d2=Double.parseDouble(s2); if(op.equals("+")){ cnt=d1+d2; } if(op.equals("-")){ cnt=d1-d2; } if(op.equals("×")){ cnt=d1*d2; } if(op.equals("÷")){ if(d2==0) cnt=0; else cnt=d1/d2; } if(!s1.contains(".")&&!s2.contains(".")&&!op.equals("÷")) { int res = (int) cnt; et_input.setText(res+""); }else { et_input.setText(cnt+"");} } //如果s1是空 s2不是空 就执行下一步 else if(!s1.equals("")&&s2.equals("")){ double d1=Double.parseDouble(s1); if(op.equals("+")){ cnt=d1; } if(op.equals("-")){ cnt=d1; } if(op.equals("×")){ cnt=0; } if(op.equals("÷")){ cnt=0; } if(!s1.contains(".")) { int res = (int) cnt; et_input.setText(res+""); }else { et_input.setText(cnt+"");} } //如果s1是空 s2不是空 就执行下一步 else if(s1.equals("")&&!s2.equals("")){ double d2=Double.parseDouble(s2); if(op.equals("+")){ cnt=d2; } if(op.equals("-")){ cnt=0-d2; } if(op.equals("×")){ cnt=0; } if(op.equals("÷")){ cnt=0; } if(!s2.contains(".")) { int res = (int) cnt; et_input.setText(res+""); }else { et_input.setText(cnt+"");} } else { et_input.setText(""); } }
这段代码是一个计算器的核心逻辑,主要是根据用户输入的两个数和运算符进行计算,并将结果显示在输入框中。
首先,代码定义了一个变量`cnt`,用于存储计算结果,初始化为0。然后通过判断输入框中的两个数`s1`和`s2`是否为空,以及运算符`op`的类型,进行不同的计算。如果两个数都不为空,根据运算符的类型进行加减乘除的计算,并将结果存入`cnt`中。如果两个数都是整数,且运算符不是除法,将结果转换成整数后显示在输入框中;否则直接显示浮点数结果。
接下来,如果`s1`不为空而`s2`为空,说明用户只输入了一个数和一个运算符,此时根据运算符的类型进行特定的计算,结果存入`cnt`中。如果`s1`是整数,将结果转换成整数后显示在输入框中,否则直接显示浮点数结果。
如果`s1`为空而`s2`不为空,说明用户只输入了一个数和一个运算符,此时根据运算符的类型进行特定的计算,结果存入`cnt`中。如果`s2`是整数,将结果转换成整数后显示在输入框中,否则直接显示浮点数结果。
最后,如果`s1`和`s2`都为空,说明用户没有输入任何内容,此时将输入框清空。