Как перечислить методы, которые не наследуются?

69
4

У меня есть следующие два класса Java (Command and Player). Я хотел бы иметь возможность перечислить из класса Command все общедоступные методы из класса Player, без необходимости их жесткого кодирования. Я пробовал несколько способов, включая интерфейс или шаблон команды, но я не владею Java, и мне не удалось заставить их работать.

Мне кажется, что использование API отражения Java будет проще. Однако, когда я использую его для печати общедоступных методов из класса Player, я получаю посторонние методы, которые, как я полагаю, наследуются от класса Object.

Есть ли способ включать только те методы, которые я определил сам (т.е. те, которые начинаются с "public method: public void Player.")?

Спасибо,

LC

Вот результат, который я получаю:

public method: public void Player.search(Command)
public method: public Room Player.getCurrentRoom()
public method: public void Player.engage()
public method: public void Player.trade(Command)
public method: public void Player.goRoom(Command)
public method: public void Player.takeItem(Command)
public method: public void Player.dropItem(Command)
public method: public void Player.lock(Command)
public method: public void Player.unlock(Command)
public method: public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public method: public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public method: public final void java.lang.Object.wait() throws java.lang.InterruptedException
public method: public boolean java.lang.Object.equals(java.lang.Object)
public method: public java.lang.String java.lang.Object.toString()
public method: public native int java.lang.Object.hashCode()
public method: public final native java.lang.Class java.lang.Object.getClass()
public method: public final native void java.lang.Object.notify()
public method: public final native void java.lang.Object.notifyAll()

Вот класс Command:

import java.lang.reflect.Method;

public class Command
{

// a constant array that holds all valid command words
private static String[] validCommands;

private String commandWord;
private String secondWord;

public Command(String firstWord, String secondWord)
{
commandWord = firstWord;
this.secondWord = secondWord;
}

[...] //some code omitted

public boolean process(Player player)
{

Class pClass = player.getClass();
Method[] methods = pClass.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println("public method: " + methods[i]);
}

boolean wantToQuit = false;

if(commandWord == null) {
System.out.println("I don't know what you mean...");
return false;
}

if (commandWord.equals("help")) {
printHelp();
}
else if (commandWord.equals("go")) {
player.goRoom(this);
}
else if (commandWord.equals("quit")) {
wantToQuit = quit();
}
else if (commandWord.equals("take")) {
player.takeItem(this);
}
else if (commandWord.equals("drop")) {
player.dropItem(this);
}
else if (commandWord.equals("search")) {
player.search(this);
}
else if (commandWord.equals("engage")) {
player.engage();
}
else if (commandWord.equals("trade")) {
player.trade(this);
}
else if (commandWord.equals("lock")) {
player.lock(this);
}
else if (commandWord.equals("unlock")) {
player.unlock(this);
}
else {
System.out.println("Invalid command. Type 'help' if you forgot the list of available commands.");
}
// else command not recognised.
return wantToQuit;
}
}

Вот контур класса Player:

public class Player
{
private String name;
private Room currentRoom;
private ArrayList<Item> items;

Player (String name, Room startingRoom)
{
this.name = name;
items = new ArrayList<Item>();
this.currentRoom = startingRoom;
printWelcome();
}

public void engage()
{
[...]
}

public void trade(Command command)
{
[...] }

public void goRoom(Command command)
{
[...] }

public void search(Command command)
{
[...] }

public void takeItem(Command command)
{
[...] }

public void dropItem(Command command)
{
[...] }

public void lock(Command command)
{
[...] }

public void unlock(Command command)
{
[...]
}

}

спросил(а) 2014-04-02T02:55:00+04:00 6 лет, 5 месяцев назад
1
Решение
71

Вы хотите использовать класс getDeclaredMethods() из API отражения Java.

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredMethods()

Это дает вам только методы, объявленные в рассматриваемом классе, игнорируя суперклассы и интерфейсы.

ответил(а) 2014-04-02T03:05:00+04:00 6 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема