import java.lang.reflect.*;
public class Exp3 {
public static void main(String[] args) {
A a1 = new A();
Class<?> c = A.class;
try {
Method m = c.getMethod("print",new Class[]{int.class,int.class});
Object o = m.invoke(a1,new Object[]{10,20});
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A {
public void print(int a,int b) {
System.out.println(a+b);
}
public void print(String a,String b) {
System.out.println(a.toUpperCase()+","+b.toLowerCase());
}
}
疑惑列表
Class<?> c = A.class;
为什么要<?>,不过我在IDEA这种编辑器里面Class c = A.class
是可以编译通过的,然后手动javac编译他就会报错,说使用了未经检查或不安全的操作
Object o = m.invoke(a1,new Object[]{10,20});
为什么是Object而不能直接是Integer,我之前getMethod的时候不应该早就指定好了参数吗。如果我使用了Integer他会警告最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用;
1.这个是泛型Class<?> c = A.class ?可以是任意类型 就比如ArrayList array = new ArrayList(); array.add(1);可以array.add("1");也可以但是你放到了这个ArrayList中的数据类型明显就乱了 这样的数据不安全没有价值 所以必须如下ArrayList<String> array=new ArrayList<String>(); 这时候你的array.add(1);就会报错 不可以存放int 类型的数据


2.编译不是报错是警告 warn error 是不一样的
3
如图修改后就参数对应就没有警告了