Как передать класс в качестве параметра в Java?
Есть ли способ передать класс в качестве параметра в Java и запустить некоторые методы из этого класса?
void main()
{
callClass(that.class)
}
void callClass(???? classObject)
{
classObject.somefunction
// or
new classObject()
//something like that ?
}
Я использую Google Web Toolkit и не поддерживает отражение.
Ответы
Ответ 1
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);
}
}
}
Также см.
Ответ 2
public void callingMethod(Class neededClass) {
//Put your codes here
}
Чтобы вызвать метод, вы вызываете его следующим образом:
callingMethod(ClassBeingCalled.class);
Ответ 3
Использование
void callClass(Class classObject)
{
//do something with class
}
A Class
также является объектом Java, поэтому вы можете ссылаться на него, используя его тип.
Подробнее об этом можно узнать из официальной документации.
Ответ 4
Это нелегко. Вот метод, который вызывает статический метод:
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);
}
Update:
Подождите, я только что посмотрел тег gwt на вопрос. Вы не можете использовать отражение в GWT
Ответ 5
Я не уверен, что вы пытаетесь выполнить, но вы можете подумать, что передача класса может быть не тем, что вам действительно нужно делать. Во многих случаях дело с классом, подобным этому, легко инкапсулируется в шаблон factory какого-либо типа, а использование этого осуществляется через интерфейс. здесь один из десятков статей по этой схеме: http://today.java.net/pub/a/today/2005/03/09/factory.html
с использованием класса внутри factory может выполняться различными способами, в первую очередь с помощью файла конфигурации, который содержит имя класса, реализующего требуемый интерфейс. Затем factory может найти этот класс из пути класса и построить его как объект указанного интерфейса.
Ответ 6
Посмотрите на учебник отражения и API отражения Java:
https://community.oracle.com/docs/DOC-983192 введите описание ссылки здесь
и
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
Ответ 7
Как вы сказали, GWT не поддерживает рефлексию. Вы должны использовать отложенную привязку вместо отражения или стороннюю библиотеку, такую как gwt-ent для отражения suppport на уровне gwt.
Ответ 8
Вот так:
http://download.oracle.com/javase/tutorial/extra/generics/methods.html
вот объяснение методов шаблона.