JAVA反射调用

这是将要用来反射的类TestRef,接下来将完成以下几个反射
1.反射调用方法test();
2.反射调用标识为private的方法getString(String args);
3.反射成员变量List s;

需要被反射的类如下:

public class TestRef {
  public List<String> s;
  public List<String> getS() {
        return s;
    }
  public void setS(List<String> s) {
        this.s = s;
    }
  public void test(String[] args){
        System.out.println(Arrays.toString(args));
    }
  @SuppressWarnings("unused")
  private String getString(String args){
        return args;
    }
}

反射的实现如下:

    public static void main(String[] args) {
        TestRef t = new TestRef();
        try {
            //通过TestRef的实例对象t 得到TestRef的Class的实例化对象
            Class c1 = t.getClass();
            //另外两种得到Class的方法
            //Class c2 = Class.forName("testCase3.TestRef");
            //Class c3 = TestRef.class;
            //获取TestRef自定义的全部方法
            for (Method m : c1.getDeclaredMethods()) {
                if ("test".equals(m.getName())) {
                //以invoke方法反射调用,传入值如下:
                    m.invoke(t, new Object[] { new String[] { "12312312",
                            "asdfsd", "yufhjdfhgj" } });
                }
                //通过setS方法给TestRef的List<String> s赋值
                if ("setS".equals(m.getName())) {
                    List<String> l = new ArrayList<String>();
                    l.add("1234");
                    l.add("56723dd");
                    m.invoke(t, new Object[] { l });
                    System.out.println("ListS为:" + t.getS());
                }
                if ("getString".equals(m.getName())) {
                //私有方法必须setAccessible(true),不然是没有权限访问的
                    m.setAccessible(true);
                    String str = (String) m.invoke(t, "getString123");
                    System.out.println("反射getString方法返回:" + str);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

反射List li ,单拿出来,此处将绕过泛型的检测

    @Test
    public void test() {
        //泛型为Inteegr
        List<Integer> li = new ArrayList<Integer>();
        Class c2 = li.getClass();
        try {
        //通过invoke方法,将List的add方法反射调用,我们可以存非Integer对象
        //具体操作如下:
            Method m = c2.getMethod("add", Object.class);
            m.invoke(li, 1);
            m.invoke(li, (Object) 2.0);
            m.invoke(li, (Object) "nmkl");
            m.invoke(li, new Object[] { "sadas" });
            m.invoke(li, new Object[] { "123fdgd" });
            m.invoke(li, new Object[] { 12.0 });
            m.invoke(li, new Object[] { new String[] { "ahjk", "qwyui",
                    "16783ugi" } });
            System.out.println(li);
            for (int i = 0; i < li.size(); i++) {
                System.out.println(li.get(i));
                //取出List<Integer>中通过反射存的String[]
                Object o = li.get(i);
                if (o instanceof String[]) {
                    System.out.println(Arrays.toString((String[]) o));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值