2010-05-22 2 views
0

Я пытаюсь сделать метод, который принимает аргумент Country.class, User.class и т. Д. И возвращает argument.count().Передача класса ("Country.class") в качестве аргумента в Java

Все возможные классы, которые я бы предоставил этому методу, простираются от Model и имеют метод count().

Мой код:

private static long <T> countModel(Model<T> clazz) 
{ 
    // there is other important stuff here, which prevents me from 
    // simply by-passing the method altogether. 

    return clazz.count(); 
} 

Вызывается:

renderArgs.put("countryCount", countModel(Country.class)); 

Однако это просто не работает.

Как мне это сделать, пожалуйста?

+0

Я не понимаю, о чем вы просите, 'Country.class' является' Class' и не имеет 'count()'. Не могли бы вы перефразировать свой вопрос на простом английском? –

+1

Вы не являетесь классами, чтобы иметь определенный статический метод? Это очень странный дизайн. – whiskeysierra

ответ

5

Я думаю, что вы хотите сделать

private long countModel(Class<? extends Model> clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException 
{ 
    Method countMethod = clazz.getDeclaredMethod("count", null); 
    return (Long) countMethod.invoke(null, null); 
} 

Надеется, что-то, как это будет работать (мои навыки отражения не так уж хорошо).

+0

Это все! Просто нужно было вынуть «нулевые» аргументы, и это сработало. Спасибо. –

2

Не понимайте, чего вы пытаетесь достичь. Вы имели в виду это?

private static long <T> countModel(Model<T> model) 
{ 
    return model.count(); 
} 

renderArgs.put("countryCount", countModel(country)); 

EDIT: Если счетчик является статическим методом, он не имеет ничего общего с моделью. Статический метод не наследуется. Так что все, что вам нужно сделать, это вызвать его непосредственно,

renderArgs.put("countryCount", Country.count()); 
+0

Нет, классы имеют 'count()' как статический метод, а не объекты. Извините, если я не понимаю. –

+0

См. Мое редактирование .... –

+0

Первая часть даже не компилируется, поэтому я не думаю, что это то, что означал OP :) –

0

В строке

renderArgs.put("countryCount", countModel(Country.class)); 

вы называете countModel с Class<Country>, но вы должны вызвать его с экземпляром Country, как это:

Country country = new Country(); 
renderArgs.put("countryCount", countModel(country); 
-1

Вы передаете Country.class который является Class объектом. Как это объект Model?

0

Вы не передавая экземпляр страны здесь, вы передаете объект класса:

renderArgs.put("countryCount", countModel(Country.class)); 

Вам нужно создать экземпляр модели и передать его в качестве аргумента:

 

Model model = new Country(); 
renderArgs.put("countryCount", countModel(model)); 
 

или

 

Country country = new Country(); 
renderArgs.put("countryCount", countModel(country)); 
 

В этом случае Country.class является объектом типа Class<Country>.

0

В ответ на ваши комментарии ZZ Coder; статический метод в Java вызывается в контексте пространства имен класса, как Model.count() для статического метода count() в классе Model, но этот метод не стал частью Model.class, Model.class является экземпляром Class описания класса Model. (Я могу видеть, где путаница происходит, было бы логично, чтобы иметь специализированный Model.class, который включает статические методы, но Java не desinged именно так.)

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

1

Разъяснение, вы хотите, класс (A), который вынужден иметь метод конкретного класса (B), и вы хотите передать этот класс в качестве аргумента в какой-то другой метод (C) и есть тот метод (C) вызова этот метод класса на этом классе (A.B())?

Первая часть, ограничение типа, которое невозможно сделать. Система типов Java просто не работает.

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

private static <T extends Model> long countModel(Class<T> clazz) throws Exception 
{ 
    return (Long) clazz.getMethod("count").invoke(null); 
} 

The null является экземпляр для вызова этого на (нет, например, это метод класса). Литой до Long требуется в результате invoke() является Object. Параметр type должен идти до типа результата. И все это может принимать любой класс, который является подклассом Model в качестве параметра; он будет просто сбой во время выполнения, если нет метода count. Их перерывы.

(Также обратите внимание, что если вы хотите, чтобы передать аргументы count(), вы должны указать классы этих аргументов для getMethod и ценности себя invoke, в обоих случаях в качестве последующих аргументов. Обе модели поддерживают java5 списки аргументов переменной .)

+0

Спасибо, это работает. frosty_hotboy был первым, поэтому я дал ему тик. –

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