首页 > 解决方案 > Class.forName(String) 与动态字符串不起作用

问题描述

这段代码:

private BasePlayer addPlayer(Player player) {
    BasePlayer currentPlayer;
    try{
      String playerClassName = this.getClass().getPackage().toString() + ".Player";
      Class cPlayer = Class.forName(playerClassName);
      Constructor constructor = cPlayer.getConstructor(new Class[]{ Player.class });
      currentPlayer = (BasePlayer) constructor.newInstance(new Object[]{player});
    } catch (ClassNotFoundException e) {
      log.info(e.toString());
      currentPlayer = new BasePlayer(player);
    } catch (IllegalAccessException | IllegalArgumentException | InstantiationException | NoSuchMethodException | SecurityException | InvocationTargetException e) {
      log.info(e.toString());
      return null;
    }
    log.info(player.getName() + " added to player list with UUID: " + player.getUniqueId().toString());
    playerMap.put(player.getUniqueId(), currentPlayer);
    return currentPlayer;
  }

抛出异常

Java.lang.ClassNotFoundException:包 com.warnea.codecraft.Player

但是,如果我改变

      String playerClassName = this.getClass().getPackage().toString() + ".Player";
      Class cPlayer = Class.forName(playerClassName);

      String playerClassName = "com.warnea.codecraft.Player";
      Class cPlayer = Class.forName(playerClassName);

它工作正常。为什么我需要看似硬编码包名称?

标签: java

解决方案


推荐阅读