2 回答

TA貢獻1796條經驗 獲得超4個贊
首先從 clazz 變量創建對象,然后調用該對象的方法。toString()
clazz.newInstance().toString();
如果你有一個默認的構造函數,那么它也可以工作:
clazz.getConstructor().newInstance().toString();
更新:如果你想做一般的測試函數,那么你必須實現這樣的測試函數。
public void TestToString(Object obj,String expectedVal){ assertEquals(obj.toString(),expectedVal); }

TA貢獻1821條經驗 獲得超6個贊
不能對參數調用方法。這只是類的描述,但要調用方法,您需要實例化該類。
您可以:
- 使用反射創建.class參數的實例以調用該方法
,或者
- 使用反射來調用實例上的方法。Class
但底線是,你需要一個實例。
還有一點評論(正如Joachim Sauer已經說過的那樣):
方法存在于類上,并且所有內容都擴展了類,因此它始終可用。
不需要反射,泛型或轉換。您只需在類中重寫此方法即可。toString()
Object
Object
一個小例子來演示調用String()的不同方法:
public class Test {
private String name = "unnamed";
public Test() {}
public Test(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return name;
}
public static <T> T doReflectionCreateToString(Class<T> clazz) {
try {
T newT = clazz.getConstructor(String.class).newInstance("Name 2");
System.out.println("Created by reflection: "+ newT);
return newT;
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
| NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
return null;
}
@SuppressWarnings("unchecked")
public static <T, E> E doReflectionCall(T obj, String methodName, Object[] arguments, Class<E> returnClazz) {
try {
Class<?> clazz = obj.getClass();
Method myMethod = clazz.getDeclaredMethod(methodName);
return (E) myMethod.invoke(obj, arguments);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
return null;
}
public static <T> void doGenericToString(T obj) {
System.out.println("toString by Generic way: "+ obj);
}
public static void main(String[] args) {
Test t = new Test();
t.setName("Name 1");
System.out.println("toString by standard way: "+ t);
doGenericToString(t);
System.out.println("Called by reflection: "+ doReflectionCall(t, "toString", new Object[]{}, String.class));
Test newT = doReflectionCreateToString(Test.class);
System.out.println("Returned by reflection: "+ newT);
}
}
哪些輸出:
按標準方式 toString: 名稱 1
to按通用方式排列: 名稱 1
由反射調用: 名稱 1
由反射創建: 名稱 2
由反射返回: 名稱 2
如您所見,無論是通過標準方式還是通過泛型或更糟糕的反射,都會導致相同的邏輯。
我希望這能啟發你(和其他人);)
添加回答
舉報