2012-06-29 3 views
-2

тест-общественного недействительными (объект Object) {Java Объект литья

 //Here i have to set the values of the obj using its setter . 
    } 

Тест может быть вызван с двумя объектами в качестве параметра. EG: тест (автономный) и тест (webapp), где автономные и webapp являются фасолью.

public class standalone{ 
     int version; 
    //setter and getter 
} 

public class Webapp{ 
    String version; 
    //setter and getter 
} 

Этот метод испытаний должен устанавливать значения в соответствии с объектом параметра. Например: ЕСЛИ я передаю автономный параметр. вызывается метод setd автономного метода shd. Как достичь этого?

Примечание: без использования интерфейса. Как это сделать? Спасибо.

+1

вы можете сделать это с помощью наследования и полиморфизма ... – hovanessyan

ответ

1
public static void setVersion(Object obj, int v) throws Exception { 
    for (Method m : obj.getClass().getMethods()) { 
    final Class<?>[] t = m.getParameterTypes(); 
    if (m.getName().equals("setVersion") && t.length == 1) 
     m.invoke(obj, t[0] == String.class? String.valueOf(v) : v); 
     break; 
    } 
} 
+0

Hi .. Спасибо ..Если я хочу вызвать setversion, но установленные версии имеют другой тип. Как я могу это вызывать? – Jeevi

+0

Да, это ans, который я ищу .. :) – Jeevi

+0

Но как назвать его динамически, если он принимает разный тип параметра? – Jeevi

0

В простейшей, как вы могли бы сделать так:

public void test(Object obj) { 

    if(obj instanceof Standalone) { 
     ((Standalone)obj).setVersion(1); 
    } else if (obj instanceof WebApp) { 
     ((WebApp)obj).setVersion(1); 
    } 

} 

Старайтесь избегать использования отражения для достижения этой цели, потому что он будет делать задачи рефакторинга очень трудно. То же самое применимо для сравнения имени класса со строкой.

Если вы хотите что-то более изящное вы могли бы сделать что-то вроде этого:

public class abstract AbstractEnv { 
    int version = 0; 
    // setters and getters 
} 

public class Standalone extends AbstractEnv{ 
} 

public class Webapp extends AbstractEnv{ 
} 

с таким подходом вы можете настроить его так:

public void test(AbstractEnv obj) { 

    obj.setVersion(1); 

} 
0

Оба ваших классов должен реализовывать интерфейс, такой как VersionSettable. Что объявляет метод setVersion(int version).

public class standalone implements VersionSettable { 
     int version; 
    //setter and getter 
} 

public class Webapp implements VersionSettable { 
     int version; 
    //setter and getter 
} 

interface VersionSettable { 
    setVersion(int version); 
} 

Затем вы можете изменить метод испытания на это:

public void test(VersionSettable obj){ 
    obj.setVersion(17); 
} 
0

Вы могли бы сделать как StandAlone и WebApp реализовать интерфейс, например

interface VersionSettable { 
    void setVersion(int version); 
} 

public class Standalone implements VersionSettable{ 
     int version; 
    //setter and getter 
} 

public class Webapp implements VersionSettable{ 
     int version; 
    //setter and getter 
} 

public void test(VersionSettable versionSettable){ 
    versionSettable.setVersion(42); 
} 
0

Я думаю, что было бы лучше, если вы используйте наследование в этом случае, потому что (насколько я могу это получить) как автономные, так и WebApp являются приложениями.

Таким образом, вы можете определить верхний класс «Приложение», и как StandaloneApp, так и WebApp расширят его, поскольку можно определить «есть» связь.

Скелет код:

define class Application 
define class StandaloneApp extends Application, implements method setVersion(int) 
define class WebApp extends Application, implements method setVersion(int) 

define test method, which accepts "Application" obj in the arguments 

Также вы можете применить любой из интерфейсов решений, представленных выше.

0

Вы можете просто сделать это:

interface SetVersion{ 
    void setVersion(int version); 
} 
class Standalone implements SetVersion{} 
class WebApp implements SetVersion{} 
public void test(SetVersion version){ 
     version.setVersion(1); 
    } 

Или самый простой способ будет использовать .instanceOf

if(obj.instanceOf(Standalone)){ 

} 
Смежные вопросы