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

查看:129
本文介绍了关于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 调用;

解决方案

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

如图修改后就参数对应就没有警告了

这篇关于关于java中的invoke反射过程几点疑惑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆