学习笔记之内省和JavaBean

JavaBean与内省操作详解
本文深入探讨JavaBean的概念及使用方式,详细介绍如何通过内省API获取和设置JavaBean属性,包括JavaBean实例对象(VO)的创建、属性获取与设置方法的应用,以及内省API的具体实现和操作流程。

内省:IntroSpector,意思为检查、视察。对内部进行检查,了解内部细节。主要用于对JavaBean进行操作。

 JavaBean是一种特殊的类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合一定的规则。

譬如:要获取age属性,那么方法名要写成getAge()。

方法名要以get或set,符合这个规则的类就叫JavaBean。

这种javabean的实例对象,称为值对象VO(ValueObject)。

一个符合JavaBean特点的类可以当做普通类一样进行使用,但把它当做JavaBean会更方便。

JDK中提供了JavaBean进行操作的一些API,这套API成为内省

一个java类不一定要当做javabean来操作;一个javabean一定可以当做一个普通java类来操作。

get方法没有传入参数,有返回类型,访问权限为public;

set方法有传入参数,没有返回类型,访问权限为public。

如果把一个java类当一个javabean来看,javabean的属性是根据get和set方法的名称来推断出来的;

如:

class Person{

      private int x;

      public int getAge(){

           return x;

      }

      public void setAge(int  age){

            this.x = age;

      }

}

person 当做一个javabean来看,那么person类的属性是根据方法名推断出来的,从外部来看,根本看不到java类内部的成员变量。

setId()的属性名-->id

isLast()的属性名-->last

setCPU()的属性名-->CPU

getUPS()的属性名-->UPS

总之,如果set或get后面第一个字母是大写,第二个字母是小写,则把属性名第一个字母改为小写。

下面介绍利用内省获取javabean中某个属性

public class IntroSpectorDemo {
 public static void main(String[] args) throws Exception {
  ReflectPoint2 pt1 = new ReflectPoint2(3,5);
  
  String propertyName="x";
  
  //"x"-->"X"-->"getX"-->"MethodGetX"-->
  Object retVal = getProperty(pt1, propertyName);
  System.out.println(retVal);
  
  Object value = 7;
  setProperties(pt1, propertyName, value);
  //选中pt1.getX(),ALT+/可以自动填上输出语句
  System.out.println(pt1.getX());;

 }

 ①private static void setProperties(Object pt1, String propertyName,
   Object value) throws IntrospectionException,
   IllegalAccessException, InvocationTargetException {
  PropertyDescriptor pd2 = new PropertyDescriptor(propertyName,pt1.getClass());
  Method methodSetX = pd2.getWriteMethod();
  methodSetX.invoke(pt1, value);
 }

 ②private static Object getProperty(Object pt1, String propertyName)
   throws IntrospectionException, IllegalAccessException,
   InvocationTargetException {
//  PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
//  Method methodGetX = pd.getReadMethod();
//  Object retVal = methodGetX.invoke(pt1);
  
  BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
  PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//得到所有属性描述
  Object retVal = null;
  for(PropertyDescriptor pd1:pds){
   if(pd1.getName().equals(propertyName)){
    Method methodGetX  = pd1.getReadMethod();
    retVal = methodGetX.invoke(pt1);//pt1对象调用methodGetX方法
    break;
   }
  }
  return retVal;
 }

}

①和②是两种不同方法:

①直接用PropertyDescriptor类的构造方法获取指定属性的属性描述,再利用PropertyDescriptor类的对象获取读取属性的方法。

②采用遍历BeanInfo的所有属性的方式来查找某个RelectPoint对象的x属性。在程序中把一个类当做javabean来看,调用IntroSpector.getBeanInfo方法,得到BeanInfo对象。这个封装了这个javabean的所有结果信息。

BeanInfo不能得到某个属性的描述,只能得到所有的属性描述。

【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)内容概要:本文围绕“基于深度强化学习的微能源网能量管理与优化策略”展开研究,重点利用深度Q网络(DQN)等深度强化学习算法对微能源网中的能量调度进行建模与优化,旨在应对可再生能源出力波动、负荷变化及运行成本等问题。文中结合Python代码实现,构建了包含光伏、储能、负荷等元素的微能源网模型,通过强化学习智能体动态决策能量分配策略,实现经济性、稳定性能效的多重优化目标,并可能与其他优化算法进行对比分析以验证有效性。研究属于电力系统与人工智能交叉领域,具有较强的工程应用背景学术参考价值。; 适合人群:具备一定Python编程基础机器学习基础知识,从事电力系统、能源互联网、智能优化等相关方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习如何将深度强化学习应用于微能源网的能量管理;②掌握DQN等算法在实际能源系统调度中的建模与实现方法;③为相关课题研究或项目开发提供代码参考技术思路。; 阅读建议:建议读者结合提供的Python代码进行实践操作,理解环境建模、状态空间、动作空间及奖励函数的设计逻辑,同时可扩展学习其他强化学习算法在能源系统中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值