Java反射机制探究

强化学习代码实现PPO 梯度更新:通过截断(clipping)限制策略更新幅度,避免策略变化过大影响稳定性。首先是数据预处理,将相关数据(状态、采取的动作、状态奖励、下一个状态)放到gpu上。根据当前状态 state,利用策略网络生成每个动作的概率分布 probs。2. 修改了策略模型的输出,从每个动作的概率分布变成了动作的均值和方差。1. 修改了动作空间,离散空间变成了连续空间,使用正太分布来采样。3. 修改了动作的ratio的计算,从离散分布变成了正太分布计算。Update函数:通过经验缓冲数据来优化策略模型和价值模型。 阅读详情

Java反射机制应该算是Java中必学的一种东西了吧,不过我第一次学Java的时候应该是一看到这个就跳过了,因为感觉这种东西那会用不上。
直到今天我看完了这个特性,才发现如果有些情况下使用了反射机制,能减少很多没必要的机械式的代码量。
首先看一下通过反射机制能做到什么:

class类与Java反射

获取Class类型的对象

Class textFiledC=textFiled.getClass();

该对象可以取得

  • 包路径
  • 类名称
  • 继承类
  • 实现接口
  • 构造方法
  • 方法
  • 成员变量
  • 内部类
  • 内部类的声明类

1.访问构造方法

返回Constructor类型的对象或者数组。

objectClass.getDeclaredConstructor(String.class,int.class)
objectClass.getDeclaredConstructor(new Class[]{String.class,int.class})

Constructor中的常见方法

  • 判断是否允许带有可变数量的参数
  • 获取构造方法的各个参数类型
  • 获取异常类型的Class数组
  • 通过构造方法利用指定参数创建一个该类的对象
  • 如果构造方法的权限为private,则需要先用setAccessible方法设置为true,再创建
  • 解析出构造方法所采用修饰符的整数,再利用Modifier类的isPublic等方法进行解析。

2.访问成员变量

返回Field类型的对象或者数组。

object.getDeclaredField("birthday");

Field中常见方法

  • 获取名称
  • 获取类型的Class对象
  • 获取对象成员变量的值
  • 将指定成员的值设置为value
  • 获取int、float、boolean等类型的值
  • 设置是否忽略权限直接访问private等私有权限的成员变量
  • 获得可以解析出该成员变量所采用修饰符的整数
Field field=example.getDeclaredField("i");
field.setInt(example01,10);

3.访问方法

返回Method类型的对象或者数组。

objectClass.getDecaredMethod("print",String.class,int.class);
objectClass.getDecaredMethod("print",new Class[]{String.class,int.class});

Method中常见方法

  • 获取名称
  • 以Class数组获取方法各个参数的类型
  • 获取返回值类型
  • 以Class数组形式获得该方法可能抛出的异常类型
  • 利用指定参数args执行指定对象中的该方法,返回值为Object型
  • 查看构造方法是否允许可变参数
  • 解析出修饰符的整数
Method print=example.getDeclaredMethod("print");
print.invoke(example01);

实例

这是我目前能想到的一个最实用的实例,对实体类的序列化和反序列化,通常情况下应该是序列化为JSON比较好,这里我举的例子比较简单(其实是没建Maven工程而且懒的导包),所以就序列化为一个字符串了。

1.编写实体类

编写一个用户实体类UserEntity,包含id,用户名、密码、性别,并实现一个自定义的toString方法来进行序列化
比如一个id为2,用户名为test,密码为123456,性别为1的用户就会序列化为"2|test|123456|1"。

import java.lang.reflect.Field;
/**
 * Create by zekdot on 19-2-24.
 */
public class UserEntity {
    int id;
    String username;
    String password;
    int gender;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    public String toString(){
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append(id).append("|");
        stringBuffer.append(username).append("|");
        stringBuffer.append(password).append("|");
        stringBuffer.append(gender);
        return stringBuffer.toString();
    }
}

2.工具类的编写

序列化的时候,可以从实体类中改写toString方法来实现,但是反序列化的时候,就要通过一个一个的setXXX方法来实现,如果成员变量比较多的话这种方式就会显得非常繁琐,但是如果利用反射机制可以比较容易的实现这种方法并且可以多次复用。
下列的代码就可以通过实体类的一个序列化字符串来重建实体类对象:

import java.lang.reflect.Field;

/**
 * Create by zekdot on 19-2-24.
 */
public class EntityUtil {
    /**
     * 根据序列化字符串获取实体
     * @param cla 实体的Class
     * @param str 实体字符串
     * @return 实体
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static Object getEntity(Class cla,String str) throws IllegalAccessException, InstantiationException {
        Object object=cla.newInstance();    //实体类不需要构造参数
        Field fields[]=cla.getDeclaredFields(); //获取所有成员变量
        /*以下代码仅用于测试,通常情况应该是一个JSON序列*/
        String strs[]=str.split("\\|");
        /*测试结束*/
        for(int i=0;i<strs.length;i++){
            Field field=fields[i];
            if(field.getType().equals(int.class)){  //如果是int
                field.setInt(object,Integer.valueOf(strs[i]));
            }else if(field.getType().equals(String.class)){ //如果是String
                field.set(object,strs[i]);
            }
//            else{  //如果是自定义类
//                field.set(object,strs[i]);  //只要符合格式就能递归构建
//            }
        }
        return object;
    }
    public static void main(String args[]){
        try {
            UserEntity userEntity= (UserEntity) getEntity(UserEntity.class,"2|test|123456|1");
            System.out.println(userEntity.getPassword());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

此段代码运行结果的输出是"123456",说明实体类重建成功。

3.增加序列化方法

按照刚才的套路,其实可以通过对工具类的修改,来增加一个通过实体类对象获得其对应的字符串的方法,然后实体类调用工具类的序列化方法,这样就可以避免写很多setXXX方法,并且可以在多个实体类中复用。
首先利用反射机制在实体类中增加一个获取字符串的方法,这里打印了一些无关信息,真正的使用中可以注释掉这些语句:

    /**
     * 根据实体获取序列化的字符串
     * @param cla 实体Class
     * @param entity 实体
     * @return 序列化后的字符串
     * @throws IllegalAccessException
     */
    public static String getString(Class cla,Object entity) throws IllegalAccessException {
        Field fields[]=cla.getDeclaredFields();   //获取Field列表
        StringBuffer stringBuffer=new StringBuffer();

        for(int i=0;i<fields.length;i++){
            Field field=fields[i];
            System.out.println("追加"+field.getType()+"类型的"+field.getName());
            if(field.getType().equals(int.class)){
                stringBuffer.append(field.getInt(entity));
            }else if(field.getType().equals(String.class)){
                stringBuffer.append(field.get(entity));
            }
            if(i!=fields.length-1){
                stringBuffer.append("|");
            }
        }
        return stringBuffer.toString();
    }

编写完之后,就可以在实体类中修改toString方法,调用工具类的序列化方法:

    public String toString(){
        try {
            return EntityUtil.getString(UserEntity.class,this);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
    }

最后在EntityUtil中的main方法来测试一下该方法。

    public static void main(String args[]){
        try {
            UserEntity userEntity= (UserEntity) getEntity(UserEntity.class,"2|test|123456|1");
            System.out.println(userEntity.toString());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

运行后的打印结果为:
"
追加int类型的id
追加class java.lang.String类型的username
追加class java.lang.String类型的password
追加int类型的gender
2|test|123456|1
"
说明序列化的功能也完成了。

这样做还有一个好处,就是在增加实体类的成员及其set/get方法之后,不需要修改序列化方法,因为使用的是反射机制,是直接对类所具有的信息进行读取的。
比如给实体类中增加一个成员变量address:

public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    String address;

然后再修改一下工具类的main方法:

    public static void main(String args[]){
        try {
            UserEntity userEntity= (UserEntity) getEntity(UserEntity.class,"2|test|123456|1|测试");
            System.out.println(userEntity.toString());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

运行的打印结果为:
"
追加int类型的id
追加class java.lang.String类型的username
追加class java.lang.String类型的password
追加int类型的gender
追加class java.lang.String类型的address
2|test|123456|1|测试
"
可以证明增加成员变量后原有功能并没有收到影响。

金蝶云ERP远程办公指南:零公网IP实现安全内网穿透访问 本文详细介绍了如何利用内网穿透技术,在无需公网IP和复杂路由器设置的情况下,安全远程访问内网部署的金蝶云ERP系统。通过使用cpolar工具,逐步指导用户创建加密隧道、配置固定域名,并实现管理中心与数据中心的远程登录,有效解决了企业员工在外出或居家办公时的核心业务系统访问难题。 阅读详情

相关推荐

Qt+PCL实战:如何用QVTKOpenGLNativeWidget高效渲染3D点云(附完整代码)

本文深入解析了Qt与PCL结合使用QVTKOpenGLNativeWidget进行高效3D点云渲染的实战技术。通过对比传统QVTKWidget,详细介绍了QVTKOpenGLNativeWidget在渲染效率、内存占用和兼容性方面的显著优势,并提供了完整的代码示例和性能优化策略,助力开发者在工业检测、自动驾驶等领域实现更高效的点云可视化。

keras9composer的博客 687

CentOS 下安装Eigen库

1. 下载并按照Eigen库 首先打开Eigen官网(https://eigen.tuxfamily.org/index.php)。找到合适的Eigen版本,右键点击tar.gz压缩包,点击复制链接。如下例图 之后在CentOS终端粘贴,下载Eigen文件: wget https://gitlab.com/libeigen/eigen/-/archive/3.3.9/eigen-3.3.9.tar.gz 下载完成后解压: tar -zxvf eigen-3.3.9.tar.gz 然后打开解压的目录:

白水的博客 5391

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

Js脸部图像处理以及眼部图像正则化(创新实训日志三)

我们模型的输入是60*36的一张正则化后的眼部图片,所以需要将视频流中的信息处理成输入所需的规则的眼部图片,整个处理过程是"寻找脸部->取得眼睛图像->正则化眼部图像"。 主要工作流程参考了如下这篇博客: https://cpury.github.io/learning-where-you-are-looking-at/ 1.寻找脸部 基本思路就是首先开启摄像头,将摄像头的视频流导入v...

zekdot的博客 703

python实现语音信号的分帧、加窗、预处理

语音信号实现分帧、加窗、预处理音频文件读取预加重分帧加窗 音频文件读取 librosa是非常强大的python语音信号处理库。 读取音频: 使用语句librosa.load(path, sr=22050, mono=True, offset=0.0, duration=None)读取音频文件,默认的采样率是22050,若要保留音频的原始采样率,使用sr=None。 其中: path:表示音频文件的路径 sr:表示采样率 mono:bool,是布尔类型,表示是否将信号转换为单声道 offset:float,后

weixin_45272908的博客 1万+

基于强化学习框架的交易策略学习过程

每个状态s∈S 是一个由六个微观结构特征构成的向量,这些特征反映了当前市场的订单簿状态和近期交易行为。

xu624735206的博客 1111

第4周团队博客

本周团队完成了部分业务逻辑,并研究了情绪分析的相关API的调用与手势识别的实现,并推进了视线识别模块的建设。

zekdot的博客 521

STM32F103四位数码管动态显示实战:从硬件连接到代码调试(附Proteus仿真)

本文详细介绍了STM32F103驱动四位数码管的动态显示技术,从硬件连接到代码调试的全过程。内容包括共阴/共阳数码管的区别、GPIO配置、动态显示原理及优化方法,并附有Proteus仿真验证。通过实战案例,帮助开发者快速掌握STM32数码管动态显示的核心技术。

weixin_29168393的博客 470

第8周团队博客

本周我们首先增加了页面的控制逻辑,实现了前端根据情绪进行评分的算法以及后台的推荐系统,此外也在大数据集上进行了模型训练。 增加前端页面控制逻辑 主要完成了光标位置的确定、利用光标来对页面进行滚动、以及光标滚动到一定程度加载更多的文章列表,具体内容请参考团队博客:@zekdot 情绪评分系统实现 根据用户的七个情绪的百分比,通过一定的算法来得到一个0~10之间的数字作为评分传递给后台,这...

zekdot的博客 229

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南

本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。

weixin_42520909的博客 461

PyQt 随笔:信号与槽的两种使用方法:@pyqtSlot 和 connect

在 PyQt 中,信号与槽是实现事件驱动的一种重要机制。通过信号与槽的连接,可以实现对象之间的通信,例如在用户界面中响应按钮点击事件或者数据的变化等。PyQt 提供了两种主要的方法来创建信号与槽的连接:@pyqtSlot 装饰器和 connect 方法。本文将详细介绍这两种方法,并提供相应的源代码示例。在上面的示例中,我们定义了一个名为。

QasdCpp的博客 763

反射获取类_Java反射机制原理探究

反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象、获取对象属性以及调用对象方法。与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一个很重要的特性。它让Java有了动态特性,可以让程序更加灵活强大。本篇文章针对Java的反射基本原理做一些探究,以期对Java的反射机制有较为清晰的认识。由于网上的源码级的博客很多,本篇文章主要总结思...

weixin_42498006的博客 151

运维系列【仅供参考】: Windos10和Windos11 配置intel网卡vlan的方法

Windos10和Windos11 配置intel网卡vlan的方法

weixin_54626591的博客 477

探究java的反射机制

java反射机制

Revolver_的博客 169

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java 反射机制_Java反射机制原理探究

反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象、获取对象属性以及调用对象方法。与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一个很重要的特性。它让Java有了动态特性,可以让程序更加灵活强大。本篇文章针对Java的反射基本原理做一些探究,以期对Java的反射机制有较为清晰的认识。由于网上的源码级的博客很多,本篇文章主要总结思...

weixin_39972567的博客 105

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java 反射机制探究

一 反射机制操作类的成员变量 二 操作类的方法 三 利用反射实例化类 四 利用反射访问一个类的私有成员 五 利用反射覆盖数据对象的toString 方法 转载于:https://www.cnblogs.com/xiaoduc-org/p/5967408.html...

weixin_33744141的博客 84

探究Java反射机制:揭开隐藏在代码背后的秘密

Java反射机制是Java编程中比较重要的特性之一。它允许程序在运行时获取类的信息,包括类名、方法名、属性等。这使得程序能够动态地创建对象、调用方法和读取/修改字段值,而无需在编译时知道类的具体信息。这篇文章将介绍Java反射机制的概念、用法和实现方式。反射机制是Java语言中的一个重要特性,它允许程序在运行时动态地获取类的信息、创建对象、调用方法和访问属性,而无需提前知道类的具体信息。反射机制的实现使用了Java的Class类,它是描述类的数据类型的类。

weixin_74412978的博客 714

深入浅出Java反射机制探究Class对象与动态编程的奥秘

Java反射机制通过Class对象这面“照妖镜”,赋予了程序在运行时审视和操作自身的能力,实现了从静态世界到动态世界的跨越。它是众多高级特性和流行框架得以实现的幕后英雄。深入理解Class对象与反射机制,不仅能帮助开发者更好地使用这些框架,更能开阔编程视野,设计出更加灵活、可扩展的应用程序。然而,这是一把锋利的双刃剑,唯有在理解其奥秘与代价的基础上审慎使用,方能发挥其最大威力。

wei1368177的博客 822

探究Java反射机制:揭开隐藏在代码背后的秘密!

Java反射机制是Java编程中比较重要的特性之一。它允许程序在运行时获取类的信息,包括类名、方法名、属性等。这使得程序能够动态地创建对象、调用方法和读取/修改字段值,而无需在编译时知道类的具体信息。这篇文章将介绍Java反射机制的概念、用法和实现方式。反射机制是Java语言中的一个重要特性,它允许程序在运行时动态地获取类的信息、创建对象、调用方法和访问属性,而无需提前知道类的具体信息。反射机制的实现使用了Java的Class类,它是描述类的数据类型的类。

m0_73311735的博客 86

Java反射机制

Java反射机制 参考: https://www.imooc.com/learn/199(慕课网视频教程) *侵删* 1. Class类 Class类:类类,即类的类 public class ReflectDemo { public static void main(String[] args) {Foo foo = new Foo(); ...

zhouhan812的博客 181

java的反射机制浅谈

一、java的反射机制浅谈最近研究java研究得很给力,主要以看博文为学习方式。以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出。受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦!1.何谓反射机制根据网文,java中的反射机制可以如此定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。2.反射机制如何实现谈到反射机

Winiex's Blog 12万+

Java 反射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。     Class 类与java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了Field,Method,Constructor类(每个类都实现了Member

点滴记录 2万+

对java反射机制的一些理解

1.什么是java的反射机制? 说实话,一开始的时候我真的不知道什么是java的反射机制,反射机制又有什么用呢?甚至于在刚开始的时候,我还觉得java反射机制真的麻烦,还不如平常的使用类以及其实例对象还有方法等。但随着慢慢的理解以及了解,才发现其实java的反射机制还是很棒的,甚至于说这才是java的精髓所在,那么我们就一起来探讨一下吧: 反射(Reflection)机制:其实就是程序在运行的

YQYnsmile的博客 6524

Java中的反射机制

在我的上篇文章模拟JDK动态代理实现中涉及到了反射机制,学无止境,在此系统的学习一下Java中的反射机制。首先给出Java反射机制的定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 从以上的描述中可以看出Java中的动态特性,那么

yhao的博客 9072
上一篇: 基于PKCS#3与对称加密的密文传输方式
下一篇: Tensorflow.js运行Python下训练的CNN模型(创新实训日志一)
zekdot
博客等级 码龄10年 159粉丝 64原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值