反射...

news2025/1/13 7:36:07

一、反射的定义

 二、获取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;
	}
	@Override
	public 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.coloradmin.cn/o/1810915.html

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

相关文章

03-240605-Spark笔记

03-240605 1. 行动算子-1 reduce 聚合 格式: def reduce(f: (T, T) > T): T 例子: val sparkConf new SparkConf().setMaster("local[*]").setAppName("Operator")val sc new SparkContext(sparkConf) ​val rdd sc.makeRDD(List(1…

最好用的搜题软件大学?8个公众号和软件推荐清单! #知识分享#知识分享#经验分享

今天,我将分享一些受欢迎的、被大学生广泛使用的日常学习工具,希望能给你的学习生活带来一些便利和启发。 1.彩虹搜题 这个是公众号 一款专供大学生使用的搜题神器专注于大学生校内学习和考研/公考等能力提升 下方附上一些测试的试题及答案 1、行大量…

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

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

Vue3【十七】props的作用和组件之间的传值限定类型和默认值

Vue3【十七】props的作用和组件之间的传值限定类型和默认值 Vue3【十七】props的作用和组件之间的传值限定类型和默认值 父组件传值给子组件 多个值传递 传值限定类型和 默认值 实例截图 目录结构 代码 person.vue <template><div class"person"><p…

硬件开发笔记(十七):RK3568底板电路串口、485、usb原理图详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139589308 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

格式工厂 v5 解锁版 (免费多媒体文件转换工具)

前言 格式工厂是免费多功能的多媒体文件转换工具&#xff0c;轻松转换一切你想要的格式。利器在手&#xff0c;转换不愁&#xff01;支持几乎所有类型格式的相互转换&#xff0c;各种视频、音频、图片、PDF文档等格式&#xff0c;转换视频过程中&#xff0c;可以修复损坏的文件…

Cesium离线部署影像+地形:从0到1

Cesium加载本地影像地形 本教程记录的是小白从0-1搭建本地cesium服务的过程&#xff0c;踩的各种坑通过查找资料都一一填补&#xff0c;最终达到的效果是在本地上能够跑官网飞机航线的例子。效果如下&#xff1a; 主要流程如下&#xff1a; 1、下载离线地图和地形2、nginx部署…

工业机器人远程运维,增强智慧工厂运营管理

1、需求背景 随着工业自动化技术的普及和工业机器人应用的增加&#xff0c;制造业对于生产线稳定性和效率的要求不断提高。然而&#xff0c;传统的现场监控方式存在着地理位置限制、实时监控难度大以及诊断能力有限等问题&#xff0c;迫切需要一种更具灵活性和效率的监控方式。…

FFMpeg解复用流程

文章目录 解复用流程图复用器与解复用器小结 解复用流程图 流程图&#xff0c;如上图所示。 复用器与解复用器 复用器&#xff0c;就是视频流&#xff0c;音频流&#xff0c;字幕流&#xff0c;其他成分&#xff0c;按照一定规则组合成视频文件&#xff0c;视频文件可以是mp4…

“百变换装师”之证照之星

拍证件照是一件很麻烦的事吗&#xff1f;证件照编辑是一件复杂的事吗&#xff1f;只有专业人员才能对证件照进行编辑吗&#xff1f;以前可能是&#xff0c;但今天小编将给大家分享一个证件照编辑软件证照之星&#xff0c;它将使每一个人都能具备简单的证件照编辑技能。 证照之星…

cve_2017_12635-CouchDB垂直权限绕过

1.采用参考 https://www.cnblogs.com/mlxwl/p/16577781.html vulfocus&#xff1a;Vulfocus 漏洞威胁分析平台 2.产生原因 在2017年11月15日&#xff0c;CVE-2017-12635和CVE-2017-12636披露&#xff0c;CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同&#…

优优嗨聚集团:卤味市场新风向,创新融合与品质升级引领未来发展

卤味市场作为中国传统美食文化的重要组成部分&#xff0c;近年来呈现出蓬勃发展的态势。随着消费者口味的不断变化和市场的日益竞争&#xff0c;卤味行业正面临着前所未有的机遇与挑战。那么&#xff0c;卤味市场的未来发展将何去何从&#xff1f;本文将从创新融合和品质升级两…

Python 深度学习和机器学习的模型评估库之torchmetrics使用详解

概要 在深度学习和机器学习项目中,模型评估是一个至关重要的环节。为了准确地评估模型的性能,开发者通常需要计算各种指标(metrics),如准确率、精确率、召回率、F1 分数等。torchmetrics 是一个用于 PyTorch 的开源库,提供了一组方便且高效的评估指标计算工具。本文将详…

第26讲:Ceph集群OSD扩缩容中Reblanceing数据重分布

文章目录 1.Reblanceing数据重分布的概念2.验证Reblanceing触发的过程3.Reblanceing细节4.临时关闭Reblanceing机制 1.Reblanceing数据重分布的概念 当集群中OSD进行扩缩容操作后&#xff0c;会触发一个Reblanceing数据重分布的机制&#xff0c;简单的理解就是将扩缩容前后OSD…

2_1 Linux基础操作

2_1 Linux基础操作 文章目录 2_1 Linux基础操作0. 参考1. 装机后的一些小命令查看系统的信息2. 基础命令2.1 初识基本命令2.2 日期和时间 3. 帮助命令4. 关机、重启5. 设置主机名6. rm删除7. 软件包的管理RPM、 YUM8. IP知识9. 查看一些linux的信息10. 命令行快捷键11. 光盘挂载…

配置响应拦截器,全局前置导航守卫

1&#xff1a;配置响应拦截器 响应拦截器&#xff0c;统一处理接口的错误 问题&#xff1a;每次请求&#xff0c;都会有可能会错误&#xff0c;就都需要错误提示 说明&#xff1a;响应拦截器是咱们拿到数据的 第一个 数据流转站&#xff0c;可以在里面统一处理错误。 // 添…

Lua搭建网站后台教程

本文讲解如何使用二进制发布包和FastWeb网站管理工具搭建站点 FastWeb网站管理工具 使用该工具可快速在Windows平台部署。支持官方或三方模块的自动安装、日志调试、版本更新等。 1、下载最新版本压缩包 2、解压到任意目录(建议英文) 3、运行 ①点击 [设置]->[安装] 部…

微信小程序使用 “云函数“ 获取 “openid“

文章目录 1.前期准备2.具体操作步骤 1.前期准备 必须使用云开发已经配置好云开发 2.具体操作步骤 1.进入小程序开发工具→在云函数目录上右键→选中新建云函数 创建结束&#xff0c;自动上传&#xff08;必须确认已经上传才生效&#xff09; 2.进入对应页面的js文件&#…

【qt】坐标系变换

坐标系变换 一.物理坐标二.逻辑坐标1.平移2.旋转3.扭转4.缩放 三.案例结合画一个五角星四.总结 一.物理坐标 物理坐标系&#xff0c;就是我们上节课说的&#xff0c;坐标的原点在窗口的左上角。这节课我们可以通过改变原点的位置来达到我们想姚的逻辑坐标。 二.逻辑坐标 1.平…

Java程序设计————从控制台输入

向控制台输入信息可以借助Scanner扫描器类来实现 语法&#xff1a; Scanner input new Scanner(System.in); 提示 &#xff08;1&#xff09;在使用Scanner类型之前&#xff0c;需要首先指明Scanner类所在的位置&#xff0c;既通过代码 import java.util.Scanner; &…