关于java中的invoke反射过程几点疑惑

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());
    }
}

疑惑列表

  1. Class<?> c = A.class; 为什么要<?>,不过我在IDEA这种编辑器里面Class c = A.class是可以编译通过的,然后手动javac编译他就会报错,说使用了未经检查或不安全的操作

  2. Object o = m.invoke(a1,new Object[]{10,20});为什么是Object而不能直接是Integer,我之前getMethod的时候不应该早就指定好了参数吗。如果我使用了Integer他会警告最后一个参数使用了不准确的变量类型的 varargs 方法的非 varargs 调用;

阅读 3.2k
2 个回答

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
clipboard.png
如图修改后就参数对应就没有警告了
clipboard.png

其实这么写就可以了。

public static void main(String[] args) {
        A a1 = new A();
        Class<?> c = A.class;
        try {
            Method m = c.getMethod("print", int.class, int.class);
            Object o = m.invoke(a1, 10, 20);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

为什么传Integer[]会有警告,因为参数类型是Object...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题