反射...

一、反射的定义

 二、获取Class对象三种方式

全类名:包名+类名。

public class test {public static void main(String [] args) throws ClassNotFoundException  {//第一种方式Class class1=Class.forName("test02.Student");//第二种方法Class class2=Student.class;//第三种方法Student student=new Student();Class class3=student.getClass();System.out.println(class1==class2);System.out.println(class2==class3);System.out.println(class1);}
}

三、利用反射获取构造方法

public class test {public static void main(String [] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException  {//获取class字节码对象文件Class class1=Class.forName("test02.Student");//获取所有构造方法Constructor[] css=class1.getDeclaredConstructors();for(Constructor c:css) {System.out.println(c);}System.out.println("-------------");//获取单个构造方法Constructor con1= class1.getDeclaredConstructor(String.class);System.out.println(con1);}
}
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name) {this.setName(name);
}
protected Student(String name,int age) {this.setName(name);this.setAge(age);
}
public String getName() {return name;
}
public void setName(String name) {this.name = name;
}
public int getAge() {return age;
}
public void setAge(int age) {this.age = age;
}
@Override
public String toString() {return "Student [name=" + name + ", age=" + age + "]";
}}

 四、利用反射获取成员变量

public class Student {
private String name;
private int age;
public Student() {}
public Student(String name,int age) {this.setName(name);this.setAge(age);
}
public String getName() {return name;
}
public void setName(String name) {this.name = name;
}
public int getAge() {return age;
}
public void setAge(int age) {this.age = age;
}
@Override
public String toString() {return "Student [name=" + name + ", age=" + age + "]";
}}

public class test {public static void main(String [] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {//获取class字节码对象文件Class class1=Class.forName("test02.Student");//获取所有成员变量Field[] fi= class1.getDeclaredFields();for(Field f:fi) {System.out.println(f);}System.out.println("--------------");//获取单个成员变量Field fii= class1.getDeclaredField("name");System.out.println(fii);Student s=new Student("zhangsan",23);fii.setAccessible(true);Object r= fii.get(s);System.out.println(r);}
}

五、利用反射获取成员方法

public class Student {
private String name;
private int age;
public Student() {}
public Student(String name,int age) {this.setName(name);this.setAge(age);
}
public String getName() {return name;
}
public void setName(String name) {this.name = name;
}
public int getAge() {return age;
}
public void setAge(int age) {this.age = age;
}
public void eat(String something) {System.out.println("在吃"+something);
}
@Override
public String toString() {return "Student [name=" + name + ", age=" + age + "]";
}}
public class test {public static void main(String [] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {//获取class字节码对象文件Class class1=Class.forName("test02.Student");//获取指定的成员方法Method method= class1.getDeclaredMethod("eat", String.class);System.out.println(method);//创建对象Student s=new Student();method.invoke(s, "汉堡");}
}


六、综合练习

练习1:信息保存

对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去。

分析:可以利用反射,将成员变量获取出来,再利用IO流将获取出来的变量,写入文件中。

Student类:

public class Student {private String name;private int age;private String gender;private double height;private String hobby;public Student() {}public Student(String name,int age,String gender,double height,String hobby) {this.setName(name);this.setAge(age);this.setGender(gender);this.setHeight(height);this.setHobby(hobby);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", gender=" + gender + ", height=" + height + ", hobby="+ hobby + "]";}}

Teacher类:

public class Teacher {
private String name;
private int salary;
public Teacher() {}
public Teacher(String name,int salary) {this.setName(name);this.setSalary(salary);
}
public String getName() {return name;
}
public void setName(String name) {this.name = name;
}
public int getSalary() {return salary;
}
public void setSalary(int salary) {this.salary = salary;
}
@Override
public String toString() {return "Teacher [name=" + name + ", salary=" + salary + "]";
}
}

测试类:

package test02;import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;public class test {public static void main(String [] args) throws IllegalArgumentException, IllegalAccessException, IOException{Student s=new Student("李明",23,"女",92.5,"画画");Teacher t=new Teacher("王老师",8500);Get(s);}//创建一个方法获取成员变量public static void Get(Object obj) throws IllegalArgumentException, IllegalAccessException, IOException {//Object是获取对象//获取字节码文件Class cla=obj.getClass();//创建IO流BufferedWriter bw=new BufferedWriter(new FileWriter("c.txt"));//获取每个成员变量Field[] fields=cla.getDeclaredFields();//利用循环获取成员变量for(Field field:fields) {field.setAccessible(true);String name=field.getName();Object vaule= field.get(obj);bw.write(name+"="+vaule);bw.newLine();}bw.close();}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【区块链】深入解析Proof of Work (PoW): 区块链技术的核心驱动力

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 深入解析 Proof of Work (PoW): 区块链技术的核心驱动力引言一、PoW基本概念1.1…

C++ 判断目标文件是否被占用(独占)(附源码)

在IM软件中发起文件发送时,如果要发送的是某word文件,并且该word文件被office打开,则会提示文件正在被占用无法发送,如下所示: 那文件被占用到底是如何判断出来的呢?其实很简单,调用系统API函数CreateFile,打开该文件(OPEN_EXISTING),传入FILE_SHARE_READ共享读标记…

探索Chrome DevTools的高级技巧与隐藏功能

Chrome DevTools是网页开发者不可或缺的调试工具,它提供了丰富的功能,帮助开发者快速诊断和解决问题。然而,除了常见的功能,如元素检查、网络监控和JavaScript调试之外,DevTools还有许多不为人知的强大功能和技巧。本文…

SAP乘云而上

上周四参加了SAP原厂组织的“SAP乘云而上私享会”,由德勤赞助。活动主要的内容是介绍了RISE with SAP的上云服务包并且参观了SAP Labs。 现阶段对于大中型企业客户,SAP力推的是S/4HANA PCE(Private Cloud Edition)私有云版本,这个版本我在之…

Androidstudio项目加载不出来,显示Connect timed out

Android studio加载不出来所需要的环境依赖,99%的问题都是网络原因 解决办法有两个: 1.科学上网 2.使用国内的镜像 方法一自行解决,下面重点介绍方法二 在项目目录下找到gradle->wrapper->gradle-wrapper.properties 将项目的distributionUrl改为https://mirrors.cl…

从零到发布:npm插件包终极指南

在JavaScript和Node.js的生态系统中,npm(Node Package Manager)是最重要的包管理工具之一。通过npm,开发者可以共享代码、复用他人的工作成果以及协作开发。本指南将详细介绍如何通过npm发布自己的插件包,以便其他开发…

平安养老险陕西分公司荣获“2021-2023年乡村振兴‘三村工程’先进机构”

5月27日,中国平安成立36周年司庆暨三省推广启动大会顺利召开。会上,平安养老险陕西分公司获“2021-2023年乡村振兴‘三村工程’先进机构”荣誉表彰。 过去三年间,平安养老险陕西分公司始终坚持金融为民,在平安集团、平安养老险的指…

MFC上下文菜单与定时器学习笔记

本博文简单介绍了上下文菜单以及定时器的知识内容,作为笔记发表在csdn上面。 在这里插入图片描述 菜单资源的使用 添加菜单资源加载菜单资源: 注册窗口类时设置菜单创建窗口传参设置菜单在主窗口WM_CREATE消息中利用SetMenu函数设置 加载菜单资…

Python编写和管理装饰器库之wrapt使用详解

概要 在 Python 编程中,装饰器(decorator)是一个非常强大的工具,可以在不修改原函数代码的情况下,增强函数的功能。然而,编写装饰器有时会遇到一些复杂的问题,比如保持被装饰函数的元信息、正确传递参数等。wrapt 库提供了一组工具,帮助开发者更容易地编写和管理装饰器…

深圳比创达电子|EMI电磁干扰行业:挑战到突破,电子产业新未来

随着电子技术的飞速发展,电磁干扰(EMI)问题日益凸显,成为影响电子设备性能和稳定性的重要因素。EMI电磁干扰行业作为解决这一问题的关键领域,正面临着前所未有的机遇与挑战。 一、引言:EMI电磁干扰行业的崛…

分布式事务AP控制方案(下)

分布式事务控制方案 本篇文章给出一种要求高可用性(AP思想)的分布式事务控制方案 上篇回顾:点我查看 分布式事务控制方案1、前景回顾2、数据库和缓存的操作3、分布式文件系统1)页面静态化2)远程调用3)调用…

10秒钟docker 安装Acunetix

1、拉取镜像: 2、查看镜像: [rootdns-server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/hiepnv/acunetix latest f8415551b8f4 2 months ago 1.98GB 3、运行镜像: …

优思学院|用ChatGPT快速完成数据分析图表【柏累托图法】

数据分析是很多行业的人不可少的一部分,尤其是质量工程师更是日常的工作。然而,随着科技的进步,人工智能(AI)将逐渐承担起数据计算的工作,这意味着未来的质量工程师需要具备的不仅仅是计算能力,…

ISO 19115-3:2023 基本概念的 XML模式实现

前言 ISO(国际标准化组织)是由各国标准化机构(ISO 成员机构)组成的全球性联合会。制定国际标准的工作通常由 ISO 技术委员会完成。对某一技术委员会所关注的主题感兴趣的每个成员机构都有权在该委员会中派代表。与 ISO 联络的国际组织、政府和非政府组织也参与工作。ISO 与…

运营商大模型进化之路:策略分野与AI未来的璀璨展望

运营商大模型的进化路线“分野”与AI大模型的璀璨前景 随着人工智能技术的飞速发展,AI大模型已成为推动科技进步和产业变革的重要力量。在这个浪潮中,运营商作为通信行业的巨头,也纷纷投入大模型的研发与应用,探索出各自独特的进化…

性能测试2【搬代码】

1.性能测试脚本完善以及增强 2.jmeter插件安装以及监控使用 3.性能压测场景设置(基准、负载、压力、稳定性) 4. 无界面压测场景详解 一、性能测试脚本完善以及增强 使用控制器的目的是使我们的脚本更加接近真实的场景 1.逻辑控制器: 【事务控制器】&…

MySQL存储引擎详述:InnoDB为何胜出?

MySQL作为当前最流行的开源关系型数据库之一,其强大的功能和良好的性能使其广泛应用于各种规模的应用系统中。其中,存储引擎的设计理念是MySQL数据库灵活高效的关键所在。 一、什么是存储引擎 存储引擎是MySQL架构的重要组成部分,负责MySQL中数据的存储和提供了视图,存储过程等…

idea鼠标滚轮滚动放大缩小字体

在idea中的【file】->【settings】菜单,弹出settings窗口,点击窗口中的【Editor】->【General】,在右侧窗口中,选中【Change font size with CtrlMouse Wheel in All editors】即可。

「动态规划」如何求粉刷房子的最少花费?

LCR 091. 粉刷房子https://leetcode.cn/problems/JEj789/description/ 假如有一排房子,共n个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市…

通过 CartPole 游戏详细说明 PPO 优化过程

CartPole 介绍 在一个光滑的轨道上有个推车,杆子垂直微置在推车上,随时有倒的风险。系统每次对推车施加向左或者向右的力,但我们的目标是让杆子保持直立。杆子保持直立的每个时间单位都会获得 1 的奖励。但是当杆子与垂直方向成 15 度以上的…