Как передать класс в качестве параметра в Java?
есть ли способ передать класс в качестве параметра в Java и запустить некоторые методы из этого класса?
void main()
{
callClass(that.class)
}
void callClass(???? classObject)
{
classObject.somefunction
// or
new classObject()
//something like that ?
}
Я использую Google Web Toolkit, и он не поддерживает отражение.
9 ответов:
public void foo(Class c){ try { Object ob = c.newInstance(); } catch (InstantiationException ex) { Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); } }как вызвать метод с помощью отражения
import java.lang.reflect.*; public class method2 { public int add(int a, int b) { return a + b; } public static void main(String args[]) { try { Class cls = Class.forName("method2"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Method meth = cls.getMethod( "add", partypes); method2 methobj = new method2(); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj = meth.invoke(methobj, arglist); Integer retval = (Integer)retobj; System.out.println(retval.intValue()); } catch (Throwable e) { System.err.println(e); } } }См. Также
public void callingMethod(Class neededClass) { //Put your codes here }чтобы вызвать метод, вы называете его так:
callingMethod(ClassBeingCalled.class);
использовать
void callClass(Class classObject) { //do something with class }A
Classтакже является объектом Java, так что вы можете ссылаться на него, используя его тип.подробнее об этом с официальная документация.
такого рода вещи не просто. Вот метод, который вызывает статический метод:
public static Object callStaticMethod( // class that contains the static method final Class<?> clazz, // method name final String methodName, // optional method parameters final Object... parameters) throws Exception{ for(final Method method : clazz.getMethods()){ if(method.getName().equals(methodName)){ final Class<?>[] paramTypes = method.getParameterTypes(); if(parameters.length != paramTypes.length){ continue; } boolean compatible = true; for(int i = 0; i < paramTypes.length; i++){ final Class<?> paramType = paramTypes[i]; final Object param = parameters[i]; if(param != null && !paramType.isInstance(param)){ compatible = false; break; } } if(compatible){ return method.invoke(/* static invocation */null, parameters); } } } throw new NoSuchMethodException(methodName); }
обновление: Подождите, я только что видел тег gwt на вопросе. Вы не можете использовать отражение в GWT
Я не уверен, что вы пытаетесь достичь, но вы можете рассмотреть, что передача класса может быть не то, что вам действительно нужно делать. Во многих случаях работа с классом, подобным этому, легко инкапсулируется в фабричный шаблон некоторого типа, и использование этого делается через интерфейс. вот одна из десятков статей по этому шаблону:http://today.java.net/pub/a/today/2005/03/09/factory.html
использование класса внутри фабрики может быть выполняется различными способами, в частности, с помощью файла конфигурации, содержащего имя класса, реализующего требуемый интерфейс. Затем фабрика может найти этот класс из пути к классу и построить его как объект указанного интерфейса.
Как вы сказали, GWT не поддерживает отражение. Вы должны использовать отложенную привязку вместо отражения или стороннюю библиотеку, такую как gwt-ent для отражения support на уровне gwt.
класса в качестве параметра. Образец.
три класса:
class TestCar { private int UnlockCode = 111; protected boolean hasAirCondition = true; String brand = "Ford"; public String licensePlate = "Arizona 111"; }--
class Terminal { public void hackCar(TestCar car) { System.out.println(car.hasAirCondition); System.out.println(car.licensePlate); System.out.println(car.brand); } }--
class Story { public static void main(String args[]) { TestCar testCar = new TestCar(); Terminal terminal = new Terminal(); terminal.hackCar(testCar); } }
В hackCar метод терминального класса() принимают недостаткам можно отнести класс в качестве параметра.
Se эти: http://download.oracle.com/javase/tutorial/extra/generics/methods.html
вот объяснение для методов шаблона.
посмотрите на отражение учебник и отражение API Java:
https://community.oracle.com/docs/DOC-983192Введите описание ссылки здесь
и
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
Comments