zoukankan      html  css  js  c++  java
  • Java使用PropertyDescriptor获取实体类中私有属性的值,并给私有属性赋值

    大家都知道Java类中的私有的(private)属性是获取不到的(即使使用继承依然获取不到),那如果非要获取私有属性的值怎么办呢?一般的做法是将该java类封装称为一个JavaBean,即封装该私有属性,提供一对共有的get,set方法来访问私有属性。一般情况下都会这样做!但遇到特殊情况呢?比如,先现有一个需求:访问一个Java类的私有属性,并且该类不提供访问该私有属性的共有方法!下面就为大家介绍一种方法访问java类的私有属性。

    要获取java类的私有属性就不得不先介绍一个类PropertyDescriptor。该类为属性描述符类。通过该类提供的一系列方法来访问java类中的私有属性。

     下面看一段代码:

    BeanUtils.java

    package yw.javaben;
    
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Method;
    
    /**
     * 获取私有属性值JavaBean的帮助类
     * @author yw-tony
     *
     */
    public class BeanUtils {
        private PropertyDescriptor dp = null;
        private String propertyName;
        private Object obj;
        /**
         * 构造方法
         * @param objName 属性名称
         * @param obj  要操作的对象
         */
        public BeanUtils(String objName,Object obj){
            try{
                this.propertyName = objName;
                this.obj = obj;
                dp = new PropertyDescriptor(propertyName, obj.getClass());
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        /**
         * 获取javabean私有属性的值
         * @return
         * @throws Exception
         */
        public Object getProperty() throws Exception {
            //获取对象属性方法
            Method method = dp.getReadMethod();
            //获取属性对应的值
            Object retValue = method.invoke(obj);
            
            return retValue;
        }
        /**
         * 设置私有属性的值
         * @param setValue
         * @throws Exception
         */
        public void setProperty(Object setValue) throws Exception {
            Method method = dp.getWriteMethod();
            method.invoke(obj, setValue);
        }
        
        
    }

    BeanEntity.java

    package yw.javaben;
    
    /**
     * 验证属性标识符的javabean
     * @author yw-tony
     *
     */
    public class BeanEntity {
        private int x;
        private int y = 10;
        public int getX() {
            return x;
        }
        public void setX(int x) {
            this.x = x;
        }
        public int getY() {
            return y;
        }
        public void setY(int y) {
            this.y = y;
        }
        
    
    }

    JavaBeanTest.java

    public class JavaBeanTest {
        /**
         * 测试JavaBean
         * 
         * @param args
         */
        public static void main(String[] args) throws Exception {
            BeanEntity bean = new BeanEntity();
            String x = "x";//BeanEntity的属性名称
            BeanUtils utils = new BeanUtils(x, bean);
            utils.setProperty(12);
            Object value = utils.getProperty();
            System.out.println(value);
    
        }
    }

                                

  • 相关阅读:
    你的内存不够啦:c++: internal compiler error: Killed (program cc1plus)
    ARM交叉编译器GNUEABI、NONE-EABI、ARM-EABI、GNUEABIHF等的区别
    arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别
    ubuntu与centos的对比和选择
    Deep Convolutional Network Cascade for Facial Point Detection实践总结
    深度学习(十七)基于改进Coarse-to-fine CNN网络的人脸特征点定位
    《Deep Convolutional Network Cascade for Facial Point Detection》复现
    使用axis2,根据WSDL生成java客户端代码
    oracle字段NCHAR查询,
    【转】fastdfs第一次上传文档报错recv package size
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/3485690.html
Copyright © 2011-2022 走看看