反射...

一、反射的定义

 二、获取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++ 虚函数表 vtable

目录 1.测试代码2.查看虚函数表Widget 虚函数表虚函数表 参考 本篇文章通过小实验来了解了解虚函数表&#xff0c;测试环境 ubuntu16 gcc 5.4.0 1.测试代码 测试代码中定义了两个类&#xff0c;后面将会查看这两个类的虚函数表 #include <iostream> using namespace s…

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

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

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

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

SAP乘云而上

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

Windows Docker Desktop 安装 postgres

Docker Desktop安装 postgres 12.6 数据库 step docker pull postgres:12.6提前创建F:/D-dockerData/postgres-12.6/data 文件夹用于bind mountdocker run docker run --name postgres-12.6 \-e POSTGRES_PASSWORD123456 \-p 5432:5432 \-v F:/D-dockerData/postgres-12.6/d…

react 0至1 【jsx】

1.函数调用 // 项目的根组件 // App -> index.js -> public/index.html(root)const count 100function getName () {return test }function App () {return (<div className"App">this is App{/* 使用引号传递字符串 */}{this is message}{/* 识别js变…

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

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

http网络服务器

wwwroot(目录)/index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>比特就业课</title>…

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

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

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

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

注解 - @CookieValue

注解简介 在今天的每日一注解中&#xff0c;我们将探讨CookieValue注解。CookieValue是Spring框架中的一个注解&#xff0c;用于将HTTP请求中的Cookie值绑定到控制器方法的参数上。 注解定义 CookieValue注解用于从HTTP请求中的Cookie提取值&#xff0c;并将其绑定到控制器方…

Linux系统sort排序与uniq去重

Linux系统sort排序与uniq去重 工作中数据太多太杂&#xff0c;不便于查看分析。这时是可以采用sort将数据排序&#xff0c;同时可以配合uniq命令进行去重。 场景&#xff1a;云平台中&#xff0c;日常工作包含巡检工作&#xff0c;是通过事先编写好的巡检脚本去检测云平台的和…

阿赵UE引擎C++编程学习笔记——查找和控制Actor

大家好&#xff0c;我是阿赵。   在使用Unity引擎的时候&#xff0c;经常会用到的一个功能是通过GameObject.Find去查找场景里面的对象。这次变成在UE引擎里面做同样的事情&#xff0c;这篇文章主要做的事情有2个&#xff0c;第一是从场景里面找到特定的Actor&#xff0c;第二…

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

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

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

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

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

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

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

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

语法、语义、语用与向量化

一、字符、向量和语义 在计算机科学和自然语言处理中&#xff0c;字符、向量和语义是三个重要的概念&#xff0c;它们之间存在着密切的关系。 字符是构成文本的基本单位&#xff0c;例如字母、数字、标点符号等。在计算机中&#xff0c;字符通常用二进制编码表示&#xff0c;例…

10秒钟docker 安装Acunetix

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