JAVA反射技术的运用

目的
  • 测试目的:
  • 测试如何将一个只知道类名里面的所有属性变量 所有方法 所有构造器访问出来
  • 提示:利用新型for循环
需要访问的Property类
package myreflect.reflect1;

public class Property {
    //公有的账户号
    public int propertyNum;
    //私有的财产名字
    private String propertyName = "马云的财产" ;
    //富有不富有
    private String property = "norach";
    //私有参数
    private final static int CONSUMMER=0;

    //构造器
    public Property() {
    }

    public Property(int propertyNum, String propertyName, String property) {
        this.propertyNum = propertyNum;
        this.propertyName = propertyName;
        this.property = property;
    }

    //打印所有属性的共有方法
    @Override
    public String toString() {
        return "Property{" +
                "propertyNum=" + propertyNum +
                ", propertyName='" + propertyName + '\'' +
                ", property='" + property + '\'' +
                '}';
    }

    public int p0(int a){
        System.out.println("这是Property中的有参数有返回值的私有方法p1");
        return 0;
    }

    private void p1(){
        System.out.println("这是Property中的无参数无返回私有方法p1");
    }

    private int p2(int a){
        System.out.println("这是Property中的有参数有返回值的私有方法p2");
        return a;
    }

    public static void p3(){
        System.out.println("这是Property中的无参数无返回值静态方法p3");
    }
}
Driver01测试文件
package myreflect.reflect1;

import org.junit.Test;

import java.lang.reflect.Field;

public class Driver01 {
    /**
     *  测试目的:
     *    测试如何将一个只知道类名里面的所有属性变量 所有方法  所有构造器访问出来
     *  提示:利用新型for循环
     */
    //获取所有的属性值(先不改变值)
    @Test
    public void getAttribute() throws IllegalAccessException, InstantiationException {
        // 第一步:获取字节码对象
        Class cla = new Property().getClass();
        // 第二步:实例化对象
        Property property = (Property) cla.newInstance();
        // 第三步:拿到属性的字节码
        Field[] fields = cla.getDeclaredFields();
        // 第四步:读取该类里面所有的属性变量
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);
            Object o = fields[i].get(property);
            System.out.println(fields[i].getName()+"的值是"+o);
        }
        /**
         *  在利用属性字节码去利用for循环去去读取某一个类的所有属性变量时,
         *  如果不设置属性值的访问权限为true时,那么可以通过field.getName()方法读取所有该类属性的
         *  属性变量名(不管是私有的还是公有的),但想要获得所有的(公有和私有的)属性值,就必须设置访问权限
         *  为true
         *  注意:一个属性值只能控制自己的所有属性方法,也就是说,不能利用属性字节码数组这个整体去调用
         *        Field属性包下的属性变量操作;
         * 那什么,我不会用新型for循环去获得所有类的属性变量
         */
           }
}
测试结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值