2013-05-20 3 views
3

Есть ли способ сгладить унаследованные классы, чтобы определить, какие функции принадлежат классу?Как сгладить унаследованный класс?

, если у вас есть класс, как:

public class Person 
{ 
    public String name; 

    public void setName(String name){ 
     this.name = name; 
    } 

    public String getName(){ 
     return this.name; 
    } 
} 

и унаследованный класс как

public class Worker extends Person 
{ 
    public String job; 

    public void setJob(String job){ 
     this.job = job; 
    } 

    public String getJob(){ 
     return this.job; 
    } 
} 

При создании экземпляра работник, есть способ узнать, что Set/GetName принадлежит лицу класс?

Я видел предложения об использовании интерфейса, чтобы найти эту информацию, но я не уверен, как интерфейс лучше всего будет использовать для отображения функций отношений здесь. Могут ли какие-либо читы ссылаться на определенные классы в унаследованном классе?

EDIT:

Чтобы ответить, почему я хотел бы сделать это: Я в принципе хочу, чтобы иметь возможность перебрать методы в объекте и игнорировать те, которые приходят из определенного класса, в данном случае я хочу игнорировать класс Person.

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

+1

Можете ли вы объяснить, почему вам это нужно? – BobTheBuilder

+2

@ Jarede: Вы можете проверить отражение в java. Вы можете проверить объявленные методы, например: http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredMethod(java.lang.String, java.lang.Class ...) – Jayan

+0

Комментарий Jayan - это правильно. Если вы используете Eclipse, инспектор объектов (который показывает методы, доступные для объекта после записи точки '.'), выделяет жирным шрифтом методы, объявленные в более конкретном классе (так, для переменной« Рабочий », 'setJob' будет выделен жирным шрифтом, а' setName' не будет) – SJuan76

ответ

6

Метод isBridge в классе Method может использоваться для проверки того, объявлен ли метод в классе Person или Worker.

public static void main(String[] args) 
{ 
    Worker worker = new Worker(); 
    Class clazz = worker.getClass(); 
    Method[] methods = clazz.getDeclaredMethods(); 

    for(Method method :methods) 
    { 
     System.out.println(method.getName()+ " is in Worker: "+ !method.isBridge()); 
    } 
} 

Приведенный выше код будет выпускать продукцию, как:

setName is in Worker: false 
getName is in Worker: false 
setJob is in Worker: true 
getJob is in Worker: true 
+0

Я предполагаю, что «Мир» на самом деле должен быть рабочим? – Jarede

+0

@Jarede, Oops. Это опечатка. Починил это –

1

Вы можете использовать Reflection API проверить, существует ли метод внутри объекта, но я не понимаю, почему вы это делаете. Помня о том, как работает полиморфизм, мы должны рассматривать ваш экземпляр Worker либо как Worker, либо как Person, но зачем вы относитесь к нему как к Worker как к "не совсем Person"?

Worker w = new Worker(); 
Class c = w.getClass(); 
Class noparams[] = {}; 

boolean hasSetJob = false; 
try{ 
    c.getDeclaredMethod("setJob", noparams); 
    hasSetJob = true; 
} catch (NoSuchMethodException e) { 
    hasSetJob = false; 
} 

Во всяком случае любое использование Reflection API в аппликативных (а не структуры) код рассматривается как хак и знак того, что вы хотите делать странные вещи (которые, как правило, не так).

1

Если я правильно понимаю вашу проблему, вы можете попробовать этот способ:

Class c = new Worker().getClass(); 
Method[] ma = c.getMethods(); 

for (Method m : ma) { 
    String methodClass = m.getDeclaringClass().getName(); 
    if(methodClass.equals("net.yourpackage.Person")){ 
     // do something... 
    } 
    else if(methodClass.equals("net.yourpackage.Worker")){ 
     // do something... 
    } 
    // ... other classes 
    else if(methodClass.equals("java.lang.Object")){ 
     // do something else... 
    } 
} 
Смежные вопросы