Получить все параметры класса и их имена? - PullRequest
0 голосов
/ 11 февраля 2020

Я ищу, чтобы пользователи могли вводить имя параметра, e. «Песок», и я хотел бы знать, какой Блок ссылается на это имя.

Код ссылки:

public class Blocks implements ContentList {
public static Block air;
public static Block spawn;
public static Block deepwater;
public static Block water;
public static Block taintedWater;
public static Block tar;
public static Block stone;
public static Block craters;
public static Block charr;
public static Block sand;
public static Block darksand;
public static Block ice;
public static Block snow;
public static Block darksandTaintedWater;
public static Block holostone;
public static Block rocks;
}

Моя попытка:

String targetBlock = ctx.args[2].toLowerCase();
                Block desiredBlock = Blocks.copperWall;
                for(Block block : Blocks.all()){
                    if (block.name == targetBlock){
                        desiredBlock = block;
                    }
                }

Очевидно, не ' не работает, потому что Blocks. java не имеет метода .all (). Кроме того, Blocks. java генерируется автоматически, и я не могу изменить его или добавить методы, какие-либо идеи?

1 Ответ

2 голосов
/ 11 февраля 2020

Вы должны использовать отражение, чтобы получить доступ к полю автоматически сгенерированного файла Blocks:

import java.lang.reflect.Field;

class Block {

    private String name;
    public Block(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
class Blocks {

    public static Block wall = new Block("wall");
    public static Block corner = new Block("corner");
     ......
}

public class Main {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Field field = Blocks.class.getDeclaredField("wall"); // get the value from the args in real program
        Block b = (Block)field.get(null);
        System.out.println(b.getName());
    }
}

Несколько предостережений:

  1. getDeclaredField может вызвать исключение NoSuchFieldException, если вы предоставит имя поля данных, которое на самом деле не существует
  2. Я предположил, что сгенерированные Block экземпляры являются stati c, как это появляется в вопросе, поэтому я использую field.get(null) и не field.get(<something of type Blocks>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...