【问题标题】:Using String to find Class in java?使用字符串在java中查找类?
【发布时间】:2023-03-12 20:48:05
【问题描述】:

我创建了一个名为Entity的类,代码如下:

Entity zombie1 = new Entity();

我从扫描仪获取输入“zombie”,然后根据末尾的级别连接一个数字,留下“zombie1”作为字符串...我希望能够使用该字符串并调用

zombie1.shoot("shotgun");

但我似乎找不到解决方案。我只是做一个 if 语句,但我希望能够创建尽可能多的僵尸,而不必每次都放入更多的 if 语句。

我已经阅读了使用反射和 forString 的文章,但这似乎不是我想要的。

任何帮助都会很好。

【问题讨论】:

  • String是一个默认生成的类,里面没有.shoot这个方法!但是,您可以尝试通过 String 类扩展实体类并为其添加方法!未测试需要更多专业建议。

标签: java string class


【解决方案1】:

可能的解决方案是使用Map<String, Entity> 来存储和检索基于特定字符串的实体。如果您的实体子类型数量有限,例如僵尸、吸血鬼、受害者等,您可以使用Map<String, List<Entity>>,允许您将字符串映射到特定类型的实体,然后按数字获取该类型。

例如,

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Foo002 {
   private static final String ZOMBIE = "zombie";

   public static void main(String[] args) {
      Map<String, List<Entity>> entityMap = new HashMap<String, List<Entity>>();

      entityMap.put(ZOMBIE, new ArrayList<Entity>());

      entityMap.get(ZOMBIE).add(new Entity(ZOMBIE, "John"));
      entityMap.get(ZOMBIE).add(new Entity(ZOMBIE, "Fred"));
      entityMap.get(ZOMBIE).add(new Entity(ZOMBIE, "Bill"));

      for (Entity entity : entityMap.get(ZOMBIE)) {
         System.out.println(entity);
      }
   }
}

class Entity {
   private String type;
   private String name;

   public Entity(String type, String name) {
      this.type = type;
      this.name = name;
   }

   public String getType() {
      return type;
   }

   public String getName() {
      return name;
   }

   @Override
   public String toString() {
      return type + ": " + name;
   }

}

【讨论】:

    【解决方案2】:

    这不是你最好的选择。最好的办法是拥有地图;

    // PLEASE LOOK INTO WHICH MAP WOULD BE BEST FOR YOUR CASE OVERALL
    // HASHMAP IS JUST AN EXAMPLE.
    Map<String, Entity> zombieHoard = new HashMap<String, Entity>;
    
    String getZombieID( int id )
    {
        return String.format( "zombie%s", id );
    }
    String createZombie() {
        String zid = getZombieID( Map.size() );
        Map.put( zid, new Entity() );
        return zid;
    }
    
    void sendForthTheHoard() {
       createZombie();
       createZombie();
       String currentZombie = createZombie();
       zombieHoard.get( currentZombie ).shoot( "blow-dryer" );
       zombieHoard.get( getZombieID( 1 ) ).eatBrains();
    }
    

    【讨论】:

      【解决方案3】:

      把你的僵尸放在一个 ArrayList 中。示例:

      ArrayList<Entity> zombies = new ArrayList<Entity>();
      Entity zombie1 = new Entity();
      zombies.add(zombie1);
      Entity zombie2 = new Entity();
      zombies.add(zombie2);
      etc...
      

      那么到了该调用某个僵尸的时候了:

      zombies.get(1).shoot("shotgun");
      

      【讨论】:

        【解决方案4】:

        如果您在谈论动态调用对象上的方法,您可以使用反射来获取方法对象并调用它(注意:我可能无意中混淆了这个 Java 中的一些 C# 语法):

        Entity zombie1 = new Entity();
        Method shootMethod = Entity.class.getMethod("shoot", new Class[] { string.class });
        shootMethod.invoke(zombie1, new Object[] { "shotgun" });
        

        【讨论】:

          猜你喜欢
          • 2014-02-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-11
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          • 2012-01-18
          相关资源
          最近更新 更多