gpt4 book ai didi

java - 如何在 Java 中使用反射创建虚拟静态方法或功能等价物

转载 作者:行者123 更新时间:2023-11-29 08:13:41 25 4
gpt4 key购买 nike

我有一个射弹类树,我正在尝试使用一些反射来避免手动实现所有可能的组合,因为大多数组合都是复制粘贴或充其量是许多一个线性虚拟方法来覆盖属性。

基本上我有不同的武器类型,它们以不同的模式射击,例如双联、交替或只有一个武器,以及许多不同的射弹,例如导弹、子弹、狙击子弹。

目前的语法是:

public Bomber() {
weapons.add(new TwinLinkedWeapon<Missile>(Missile.class));
weapons.add(new Weapon<Bullet>(Bullet.class));
}

武器看起来像:

public class Weapon<T extends Projectile> {
long lastShot;
protected Constructor<? extends T> ctor;

public Weapon(Class<? extends T> projectileType) {
try {
ctor = projectileType.getDeclaredConstructor(actor.Actor.class);
} catch (SecurityException e) {
e.printStackTrace();
return;
} catch (NoSuchMethodException e) {
e.printStackTrace();
return;
}
lastShot = 0;
}

protected long getLastShotTime() {
return lastShot;
}

protected T newProjectile(actor.Actor ship){
T projectile = null;
try {
projectile = ctor.newInstance(ship);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

return projectile;
}

protected void setLastShotTime(long time) {
lastShot = time;
}

public void shoot(Actor ship) {
//calculates time passed in milliseconds
if((System.currentTimeMillis() - getLastShotTime()) > T.getShotCoolDown()) {
game.Game.getActors().add(newProjectile(ship));
setLastShotTime(System.currentTimeMillis());
}
}

public String getWeaponName(){
return "" + getClass().getName() + " " + ctor.getName();
}
}

我的问题很容易理解。在行 if((System.currentTimeMillis() - getLastShotTime()) > T.getShotCoolDown())

T 是一个抽象的 Projectile 类,而不是 Bullet 或 Missile 等派生类,所以当我调用静态方法 T.getShotDelay() 时,它总是调用 Projectile.getShotDelay() 而不是派生类。

我唯一的解决方案是使用 ctor 创建 T 的实例,并使该属性基于实例而不是基于类,但这似乎是一个“不太理想”的解决方案。

我是 java 反射的新手,不确定实现此目的的语法。我将不胜感激。

最佳答案

您可以从Class 对象获取静态方法并在null 上调用它们,无需调用构造函数。就取T的运行时类,即:

T t = something;
Class<?> tClass = t.getClass();
Method staticMethod = tClass.getMethod("methodName");
staticMethod.invoke(null); // Static methods can be invoked on null.

关于java - 如何在 Java 中使用反射创建虚拟静态方法或功能等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com