java反射~一篇文章让你懂得使用反射

本文深入探讨Java反射机制的应用,通过实例展示了如何利用反射创建对象、调用构造方法、成员变量以及成员方法,以及如何获取类的父类和接口,并解析了反射类的修饰符。内容覆盖了从基础到进阶的多个方面,为开发者提供了全面的理解。

创建Class类对象(类类型)

Dog.java:

    private String name;
    private String age;
    private String type;
    public String sex;
    public static String color;

    public void eating(){
        System.out.println("正在吃东西,别打扰我!");
    }

    public void walk(int hour){
        System.out.println("今天要散步"+hour+"小时");
    }

方法一:

        Class cls1 = Class.forName("demo11.Dog");

方法二:

        Class cls2 = Dog.class;

方法三:

        Dog dog = new Dog();
        Class cls3 = dog.getClass();

反射创建对象

        //其实调用的就是无参构造方法(反射返回的都是Object类型)
        Object d1 = cls2.newInstance();
        System.out.println(d1);

调用构造方法

1.反射调用无参构造方法
        Constructor c1 = cls2.getConstructor();
        Object d2 = c1.newInstance();
        System.out.println(d2);
2.反射调用有参构造方法
        Constructor c2 = cls2.getConstructor(String.class, String.class, String.class, String.class);
        Object d3 = c2.newInstance("旺财", "3", "哈士奇", "公");
        System.out.println(d3);
        System.out.println("---------------");
3.类的所有构造方法遍历
        Constructor[] cs = cls1.getConstructors();
        for (Constructor c : cs) {
            System.out.println(c);
            //获得方法修饰符(返回的是一个整型,后面会看打印出对应的修饰符对应的值)
            int modifier = c.getModifiers();
            System.out.println("修饰符:" + modifier);
            //获得方法参数类型
            Class[] pts = c.getParameterTypes();
            System.out.println("参数 :" + Arrays.toString(pts));
        }
        System.out.println("---------------");

结果:

调用类的成员变量

1.调用公开成员变量
        Field f1 = cls2.getField("sex");//getField只能调用公开属性,包括父类的属性
        //Field f1 = cls2.getField("name"); //异常
2.调用所有声明成员变量
        Field f2 = cls2.getDeclaredField("sex");
        Field f3 = cls2.getDeclaredField("name");//无异常
        //getDeclaredField能获得所有属性包括private等等,但是不包括父类属性,但是能获取不代表能使用
3.调用静态成员变量
        //给静态变量赋值不用指定对象,指定也不会报错
        Field f4 = cls2.getField("color");
        f4.set(null, "黑色");
4.成员变量赋值,取值
        System.out.println(f1);
        f1.set(d1, "公");
        f2.set(d2, "母");
        // f3.set(d3,"金毛");异常
        System.out.println(d1);
        System.out.println(d2);
        System.out.println("---------------");

        //获取成员变量的值
        System.out.println(f1.get(d1));
        System.out.println(f4.get(null));
        System.out.println("---------------");
5.公开成员变量的遍历
        Field fs[] = cls2.getFields();
        for (Field f : fs) {
            System.out.println(f);
            System.out.println("\t变量名:"+f.getName());
            System.out.println("\t变量类型:"+f.getType());
            System.out.println("\t修饰符:"+f.getModifiers());
        }
6.声明变量的遍历
        System.out.println("---------------");
        Field[] dfs = cls2.getDeclaredFields();
        for(Field f : dfs){
            System.out.println(f);
            System.out.println("\t变量名:"+f.getName());
            System.out.println("\t变量类型:"+f.getType());
            System.out.println("\t修饰符:"+f.getModifiers());
        }

结果:


成员方法的调用

1.无参方法的调用
        System.out.println("---------------");
        Method m1 = cls2.getMethod("eating");//无参方法
        m1.invoke(d1);
2.有参方法的调用
        System.out.println("---------------");
        Method m2 = cls2.getMethod("walk", int.class);//有参方法
        m2.invoke(d1,10);
3.遍历公开成员方法(包括父类)
        //遍历公开的成员方法,因为会获得父类的方法,所以包括了Object类的各种方法
        System.out.println("-------公开的成员方法--------");
        Method[] ms = cls1.getMethods();
        for(Method m : ms){
            System.out.println(m);
            System.out.println("\t修饰符:"+m.getModifiers());
            System.out.println("\t返回类型:"+m.getReturnType());
            System.out.println("\t方法名:"+m.getName());
            System.out.println("\t参数数组:"+Arrays.toString(m.getParameterTypes()));
        }
3.遍历声明成员方法(不包括父类)
        System.out.println("------------声明的成员方法---------------");
        Method[] dms = cls2.getDeclaredMethods();
        for(Method m : dms){
            System.out.println(m);
            System.out.println("\t修饰符:"+m.getModifiers()+"\t"+to32(m.getModifiers()));
            System.out.println("\t返回类型:"+m.getReturnType());
            System.out.println("\t方法名:"+m.getName());
            System.out.println("\t参数数组:"+Arrays.toString(m.getParameterTypes()));
        }


        System.out.println("====================================");

        for (Field f : Modifier.class.getDeclaredFields()) {
            if (f.getType() == int.class
                    && Modifier.isFinal(f.getModifiers())
                    && Modifier.isStatic(f.getModifiers())
                    && Modifier.isPublic(f.getModifiers())
            ) {
                System.out.println(f.get(null) + "---" + "\t\t\t" + to32((int) f.get(null)) + "\t" + f.getName());
            }
        }
    }

结果:由于数据太多就展示部分


反射类的父类以及接口

            //父类遍历
            Class<?> temp = cls;
            do{
                System.out.println(temp);
                temp = temp.getSuperclass();
            }while(temp!=null);

            //接口遍历
            Class<?>[] clss = cls.getInterfaces();
            for(Class<?> c : clss){
                System.out.println(c);
            }

修饰符对应的int返回值

System.out.println("====================================");

        for (Field f : Modifier.class.getDeclaredFields()) {
            if (f.getType() == int.class
                    && Modifier.isFinal(f.getModifiers())
                    && Modifier.isStatic(f.getModifiers())
                    && Modifier.isPublic(f.getModifiers())
            ) {
                System.out.println(f.get(null) + "---" + "\t\t\t" + to32((int) f.get(null)) + "\t" + f.getName());
            }
        }
    }
    public static String to32(int m) {
        String ms = "00000000000000000000000000000000" + Integer.toBinaryString(m);
        return ms.substring(ms.length() - 32);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值