反射...

一、反射的定义

 二、获取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();
       
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置详细解释:(4)高级配置

目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外,还有一些高级配置,如网页的状态,第三方模块需要另外安装,支持变量&#xff0c…

宽睿数字平台兼容TDengine 等多种数据库,提供行情解决方案

小T导读:最近,涛思数据与宽睿金融宣布了一项重要合作。在此之前,宽睿金融对 TDengine 进行了性能测试,并根据测试报告的结果,决定将 TDengine 接入宽睿数字平台,以提升高密度行情处理效率。本文将详细介绍此…

idea从git拉取代码需要输入token问题解决

idea使用git 推送代码时,提示token问题,这是因为你的代码仓库是gitlab, 然后打开修改代码后推送时,会默认使用gitlab插件,所以提示输入token解决方式就是把gitlab插件取消使用这样就好了。 取消之后再进行拉取代码即可…

【菜狗学前端】在原生微信小程序使用腾讯地图API接口

一直想调用一下地图API接口什么的,刚好遇到了这个实验就浅浅研究写了一下,顺便总结一下给其他没太了解的人一点便利,希望能够对你有所帮助~ 如何引入、配置、使用、显示。 PS:要是嫌麻烦想要源码/有什么问题欢迎评论/私信,问题的话…

[大模型]Gemma2b-Instruct Lora 微调

本节我们简要介绍如何基于 transformers、peft 等框架,对 Gemma2b 模型进行 Lora 微调。Lora 是一种高效微调方法,深入了解其原理可参见博客:知乎|深入浅出 Lora。 这个教程会在同目录下给大家提供一个 nodebook 文件,来让大家更…

AI智能体的分级

技术的分级 人们往往通过对一个复杂的技术进行分级,明确性能、适用范围和价值,方便比较、选择和管理,提高使用效率,促进资源合理分配和技术改进和标准化。 比如,国际汽车工程师学会(SAE)定义了自…

诊所管理系统有没有免费的?

随着消费市场的不断变化,消费型医疗领域逐渐受到重视,医疗机构面临激烈的行业竞争。为了提升诊所的经营管理效率和营销能力,选择一款合适的诊所管理系统变得尤为重要。然而,面对市场上众多的系统选择,如何找到适合自己…

Linux 安装ab测试工具

yum -y install httpd-tools ab -help #10个并发连接,100个请求 ab -n 200 -c 100 http://www.baidu.com/

如何制作MapBox个性化地图

我们在《如何在QGIS中加载MapBox图源》一文中,为你分享了在QGIS中加载MapBox的方法。 现在为你分享如何制作MapBox个性化地图的方法,如果你需要最新版本的QGIS及高清图源,请在文末查看获取软件安装包的方法。 新建地图样式 进入Mapbox Stu…

智慧监狱大数据整体解决方案(51页PPT)

方案介绍: 智慧监狱大数据整体解决方案通过集成先进的信息技术和大数据技术,实现对监狱管理的全面升级和智能化改造。该方案不仅提高了监狱管理的安全性和效率,还提升了监狱的智能化水平,为监狱的可持续发展提供了有力支持。 部…

计算机组成原理之计算机的性能指标

目录 计算机的性能指标 复习提示 1.计算机的主要性能指标 1.1机器字长 1.1.1与机器字长位数相同的部件 1.2数据通路带宽 1.3主存容量 1.4运算速度 1.4.1提高系统性能的综合措施 1.4.2时钟脉冲信号和时钟周期的相关概念 1.4.3主频和时钟周期的转换计算 1.4.4IPS的相关…

任务3.8.1 利用RDD实现词频统计

实战:利用RDD实现词频统计 目标 使用Apache Spark的RDD(弹性分布式数据集)模块实现一个词频统计程序。 环境准备 选择实现方式 确定使用Spark RDD进行词频统计。 Spark版本与Scala版本匹配 选择Spark 3.1.3与Scala 2.12.15以匹配现有Spar…

使用seq2seq架构实现英译法

seq2seq介绍 模型架构: Seq2Seq(Sequence-to-Sequence)模型是一种在自然语言处理(NLP)中广泛应用的架构,其核心思想是将一个序列作为输入,并输出另一个序列。这种模型特别适用于机器翻译、聊天…

定个小目标之刷LeetCode热题(11)

这是道简单题,只想到了暴力解法,就是用集合存储起来,然后找出其中的众数,看了一下题解,发现有多种解法,我觉得Boyer-Moore 投票算法是最优解,看了官方对这个算法的解释,我是这样理解…

每天一个数据分析题(三百五十九)- 多维分析模型

图中是某公司记录销售情况相关的表建立好的多维分析模型,请根据模型回答以下问题: 2)产品表左连接品牌表的对应关系属于? A. 一对多 B. 一对一 C. 多对一 D. 多对多 数据分析认证考试介绍:点击进入 题目来源于CD…

高光谱成像光源 实现对细微色差的分类--51camera

光源在机器视觉中的重要性不容小觑,它直接影响到图像的质量,进而影响整个系统的性能。然而自然光LED光源不能完全满足实际需求,比如对细微的色差进行分类,我们就需要考虑红外高光谱光源。 所谓高光谱成像,是指使用具有…

实现思路:Vue 子组件高度不固定下实现瀑布流布局

实现思路:Vue 子组件高度不固定下实现瀑布流布局 一、瀑布流布局基础实现原理 在深入解说不定高度子组件的瀑布流如何实现之前,先大体说一下子组件高度固定已知的这种实现原理: 有一个已知组件高度的数组。定义好这个瀑布流的列数&#xff…

【回调函数】

1.回调函数是什么? 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数 时,被调用的函数就是回调函数。回调函数不是由该函数的实现方…

linux的持续性学习

安装php 第一步:配置yum源 第二步:下载php。 yum install php php-gd php-fpm php-mysql -y 第三步:启动php。 systemctl start php-fpm 第四步:检查php是否启动 lsof -i :9000 计划任务 作用&am…

问题:下列关于信息的说法,错误的是( )。 #媒体#知识分享#学习方法

问题:下列关于信息的说法,错误的是( )。 A. 信息无时不在,无时不有 B. 信息随着时间的推移,效用会越来越小 C. 信息具有可处理性 D. 信息是同一时刻只能被单方使用 参考答案如图所示