クラスをJavaのパラメーターとして渡し、そのクラスからいくつかのメソッドを起動する方法はありますか?
void main()
{
callClass(that.class)
}
void callClass(???? classObject)
{
classObject.somefunction
// or
new classObject()
//something like that ?
}
Google Web Toolkitを使用していますが、リフレクションをサポートしていません。
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) {
//Cast the class to the class you need
//and call your method in the class
((ClassBeingCalled)neededClass).methodOfClass();
}
メソッドを呼び出すには、次のように呼び出します。
callingMethod(ClassBeingCalled.class);
つかいます
void callClass(Class classObject)
{
//do something with class
}
Class
はJavaオブジェクトでもあるため、その型を使用して参照できます。
詳細については、 公式ドキュメント をご覧ください。
あなたが何を達成しようとしているのかわかりませんが、クラスを渡すことはあなたが本当にしなければならないことではないかもしれないと考えたいかもしれません。多くの場合、このようなクラスの処理は、あるタイプのファクトリパターン内に簡単にカプセル化され、その使用はインターフェイスを介して行われます。そのパターンに関する多数の記事の1つを次に示します。 http://today.Java.net/pub/a/today/2005/03/09/factory.html
ファクトリ内でのクラスの使用は、さまざまな方法で実現できます。最も顕著なのは、必要なインターフェイスを実装するクラスの名前を含む構成ファイルを作成することです。次に、ファクトリはクラスパス内からそのクラスを見つけ、指定されたインターフェイスのオブジェクトとして構築します。
このようなことは簡単ではありません。静的メソッドを呼び出すメソッドは次のとおりです。
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でリフレクションを使用することはできません
メソッドを作成して受け入れます-
public <T> void printClassNameAndCreateList(Class<T> className){
//example access 1
System.out.print(className.getName());
//example access 2
ArrayList<T> list = new ArrayList<T>();
//note that if you create a list this way, you will have to cast input
list.add((T)nameOfObject);
}
メソッドを呼び出します
printClassNameAndCreateList(SomeClass.class);
クラスのタイプを制限することもできます。たとえば、これは私が作成したライブラリのメソッドの1つです。
protected Class postExceptionActivityIn;
protected <T extends PostExceptionActivity> void setPostExceptionActivityIn(Class <T> postExceptionActivityIn) {
this.postExceptionActivityIn = postExceptionActivityIn;
}
詳細については、Reflection and Genericsを検索してください。
あなたが言ったように、GWTはリフレクションをサポートしていません。リフレクションの代わりに遅延バインディングを使用するか、gwtレイヤーでのリフレクションサポートに gwt-ent などのサードパーティライブラリを使用する必要があります。