Java学习提要——方法"反射"基本操作与"绕过泛型"实验

来源:互联网 发布:淘宝如何查看加购物车 编辑:程序博客网 时间:2024/05/12 11:41

1.基本操作

方法的反射

1)如何获取某个方法:
方法的名称和方法的参数列表才能唯一决定某个方法
2)方法反射的操作:
method.invoke(对象,参数列表)

import java.lang.reflect.Method;public class UseReflect {    public static void main(String[] args) throws Exception{        //要获取print(int ,int )方法,        //1,获取一个方法就是获取类的信息,首先获取类的类类型        A a1 = new A();        Class c = a1.getClass();        /*         * 2,获取方法 名称和参数列表来决定         * getMethod获取的是public的方法,下面两种都可以         * getDelcaredMethod自己声明的方法         */        //Method m = c.getMethod("print",new Class[]{int.class,int.class})        Method m = c.getMethod("print",int.class,int.class);        //方法的反射操作        //不是调用a1操作,而是用m对象来进行方法调用,与a1调用效果都一样        //如果没有返回值,返回null,有的话就返回具体类型,下面两个Object都可以        //Object o = m.invoke(a1, new Object[]{10,10});        Object o = m.invoke(a1,10,10);        //String的操作一样    }}//先随便写两个方法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());    }}

2.绕过泛型

先下个结论:
java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了
猜想,我们可以通过方法的反射来操作,绕过编译

import java.util.ArrayList;public class MethodDemo {    public static void main(String[] args) throws Exception{        ArrayList list1 = new ArrayList();        ArrayList<String> list2 = new ArrayList<String>();        list2.add("hello");        //list.add(20); 错误        Class c1 = list1.getClass();        Class c2 = list2.getClass();        System.out.println(c1 == c2);  //true        //反射的操作都是编译之后的操作        /*        *java中集合的泛型,是防止错误输出,只在编译阶段有效        *绕过编译就无效了        *我们通过方法的反射来操作,绕过编译        */        Method m = c2.getMethod("add",Object.class);        m.invoke(list2,30);  //绕过了编译操作,就绕过了泛型        System.out.println(list2.size());        System.out.println(list2);    }}
0 0