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循环去获得所有类的属性变量
         */
           }
}
测试结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用MyEclipse 5.5完成demo示例。其中,com.jb.arklis.app.DemoApplication类利用反射技术可以观察任何非静态类(比如java.lang.String, javax.swing.JFrame等类和自定义的类,比如com.jb.arklis.dao.BaseDAO)的普通方法、构造方法以公有属性,是一个非常有实用意义的显示类。 该示例没有使用泛型技术,所以不是很完美。不过只要你稍微修改一下,就可作为自己工程中比较好的封装工具类使用! 下载解压之后,使用MyEclipse 5.5导入,打开该工程,找到DemoApplication类,然后点击run菜单-->找到(x)Arguments,然后在Program arguments中输入: com.jb.arklis.dao.BaseDAO, 然后点击run按钮,如果一切正常,那么你会看到使用反射在DemoApplication类中呼叫了BaseDAO的returnTestValue(String name)方法。 我的代码注释非常详细,相信当你看完之后,一般来说,如果不是新手(非常菜的人),那么你应该学会使用反射技术来实现封装的动作了--也就是说,你的技术有了一个非常大的提高--如果你看完之后,参见该示例中另外的JDBC代码,然后能够实现对JDBC进一步的封装,使JDBC连接的使用步骤更简单的话! OK,Good luck!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值