JAVA 反射

Java反射 Java的反射(reflection)机制是指在程序的运行状态中,借助取得任何类的内部信息,可以动态地构造任意一个类的对象,并能直接操作任意对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。反射主要用到java.lang.Class类和包下的一些类,是 Java 反射机制的核心包,提供了操作类及其成员(字段、方法、构造函数等)的类和接口。表示类的对象。提供了获取类的字段、方法、构造函数等方法。 阅读详情

一、关于反射


下面的代码是关于一个Student类复写equals方法:

 @Override  
    public boolean equals(Object obj) {  
        // TODO Auto-generated method stub  
        if (!(obj instanceof Student))  
            return false;  
        Student student = (Student) obj;  
        return this.name.equals(student.name) && this.age == student.age;  
    }  

其中要先判断传进来的obj是否就是Student的一个实例 ,也就是说虚拟机在不运行这段代码前,根部不知道Object obj具体是什么类,通过运行obj instanceof Student的返回结果来判断。

在JDK中包含了许多类String、 Integer、ArrayList、HashMap,假如把这些【java类】事物抽象成一个类即【java类】类,那么String类、Integer等等就是【java类】类的不同实例了。

java用Class来代表【java类】这种类型,而通过一个类的实例或类来获取具体是哪一个【Java类】

如:

Class clazz1=obj.getClass();//通过一个实例对象

Class clazz2=Student.class;//直接通过类.class

这就是反射,通过类或类实例获取【Java类】类

如果clazz1==clazz2 就说明obj一定是Student类型的,所以obj instanceof Student也可以用反射的方式:


	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (!(obj.getClass() == Student.class))
			return false;
		Student student = (Student) obj;
		return this.name.equals(student.name) && this.age == student.age;
	}


关于静态编译和动态编译

静态编译:在编译时确定类型,绑定对象,如以往获取对象实例是Student student=new Student(),程序在运行前就去定了哪种操作对象或类型。


动态编译:运行时确定类型,绑定对象。具体要创建的对象类型可以通过外部参数来确定,动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。spring的IOC就是利用反射原理将生成新对象的过程交给配置文件。想要新建什么类型的对象就配置XML,BeanFactory解析XML,通过反射新建实例。

因此可以看出反射的优越性,但是反射也有其缺点就是效率较低。


二、获取Class

上面的提到了 实例.getClass() 和 某类.class 两种获取Class的方法外 还可以通过类名的字符串获取 即:

Class.forName("com.heima.Student");

代码:

public static void main(String[] args) throws Exception{
		Student student=new Student(11, "黑马");
		Class  clazz1=Student.class;
		Class  clazz2=student.getClass();
		Class  clazz3=Class.forName("Blog.Student");
		System.out.println(clazz1==clazz2);
		System.out.println(clazz1==clazz3);
	}
打印:

true
true


同样,基本数据类型也可以通过.class获取 ,除此之外还可以通过包装类.Type来获取,包装类.Type和包装类.class 获取的Class是不相同的。

public static void main(String[] args) throws Exception{
		Class clazz_int=int.class;
		Class clazz_boolean=boolean.class;//基本类型的class
		Class clazz_Integer=Integer.class;
		Class clazz_Boolean=Boolean.class;//包装类的class
		Class integer_type=Integer.TYPE;
		Class boolean_type=Boolean.TYPE;//基本类型的class
		System.out.println("clazz_int==clazz_Integer:"+(clazz_int==clazz_Integer));
		System.out.println("clazz_int==integer_type:"+(clazz_int==integer_type));
		System.out.println("clazz_boolean==clazz_Boolean:"+(clazz_boolean==clazz_Boolean));
		System.out.println("clazz_boolean==boolean_type:"+(clazz_boolean==boolean_type));
	}

打印结果:

clazz_int==clazz_Integer:false
clazz_int==integer_type:true
clazz_boolean==clazz_Boolean:false
clazz_boolean==boolean_type:true


三、获取类信息

一个类的信息都存储对应的一个Class实例当中,得到Class的实例就能获取这个类的基本信息。

public static void main(String[] args) {
		Class<Student> clazz = Student.class;
		 

		//得到包名
		clazz.getPackage();

		//得到全限定名
		clazz.getName();
		
		//得到类的简称
		clazz.getSimpleName();
		
		//得到父类的class
		
		System.out.println(clazz.getSuperclass());
		
		//获得public修饰的内部类和接口
		
		Class[] clzzs = clazz.getClasses();
		for (Class class1 : clzzs) {
			System.out.println(class1.getName());
		}
	}


四、获取成员方法、构造方法、成员变量

以Person类为例:

public class Person implements Serializable{
	
	private static final long serialVersionUID = -4102534291757583600L;
	private String name;
	private Integer age;
	public String add;
	public Person(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;

	}
	public Person(String name, Integer age, String add) {
		super();
		this.name = name;
		this.age = age;
		this.add = add;
	}
	public Person() {
		// TODO Auto-generated constructor stub
	}

	public void setName(String name) {
		this.name = name;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void setAdd(String add) {
		this.add = add;
	}
	public String getAdd() {
		return add;
	}
	public String getName() {
		return name;
	}
	public Integer getAge() {
		return age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((add == null) ? 0 : add.hashCode());
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (add == null) {
			if (other.add != null)
				return false;
		} else if (!add.equals(other.add))
			return false;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	
}


获取构造方法相关 以及反射方式创建实例

public static void main(String[] args) throws Exception {
		Class<Person> clazz = Person.class;
		Constructor<Person> constructor = clazz.getConstructor();// 获取空构造方法
		Person person = constructor.newInstance();// 新建实例对象

//		constructor = clazz.getConstructor(String.class, Integer.class, String.class);// 获取带参数的Public构造方法、传入参数类型以确定具体哪一个构造方法 
//		person = constructor.newInstance("zhangsan", 11, "beijing");
		
		constructor = clazz.getDeclaredConstructor(String.class, Integer.class, String.class);// 暴力获取带参数的构造方法、传入参数类型以确定具体哪一个构造方法
		constructor.setAccessible(true);
		//暴力破解必须将Accessible设为True,否则会报Exception in thread "main" java.lang.NoSuchMethodException
		person = constructor.newInstance("zhangsan", 11, "beijing");
		
		
		Constructor<?>[] constructors = clazz.getDeclaredConstructors();//暴力或取所有构造方法  返回构造方法数组
		for (Constructor<?> newconstructor : constructors) {//遍历每一个构造方法
			System.out.println(newconstructor);
			Class<?>[] ParameterType=newconstructor.getParameterTypes();//获取参数数组
			for (Class<?> class1 : ParameterType) {//遍历参数数组
				System.out.println(class1.getName());//获取参数类型名
			}
			System.out.println("-----------------");
		}
打印结果:



获取成员方法相关 以及并通过反射调用方法

public class ClassTest {

	public static void main(String[] args) throws Exception {
		Class<Person> clazz = Person.class;
		Constructor<Person> constructor = clazz.getConstructor();// 获取空构造方法
		Person person = constructor.newInstance();// 新建实例对象

//		constructor = clazz.getConstructor(String.class, Integer.class, String.class);// 获取带参数的Public构造方法、传入参数类型以确定具体哪一个构造方法 
//		person = constructor.newInstance("zhangsan", 11, "beijing");
		
		constructor = clazz.getDeclaredConstructor(String.class, Integer.class, String.class);// 暴力获取带参数的构造方法、传入参数类型以确定具体哪一个构造方法
		constructor.setAccessible(true);
		//暴力破解必须将Accessible设为True,否则会报Exception in thread "main" java.lang.NoSuchMethodException
		person = constructor.newInstance("zhangsan", 11, "beijing");
		
		Method[] methods = clazz.getMethods();// 获取public 成员方法
		methods = clazz.getDeclaredMethods();// 暴力或取成员方法
		for (Method method : methods) {
			System.out.println(method);
			Class<?>[] ParameterType = method.getParameterTypes();
			for (Class<?> parameter : ParameterType) {
				System.out.println(parameter);
			}
			System.out.println("-----------------");
		}
		
		clazz.getMethod("setName", String.class).invoke(person, "aaa");// 获取特定方法并通过反射调用方法
		System.out.println(person.getName());
		
		
	}
}
打印结果:


获取成员相关 以及反射方式赋值

public static void main(String[] args) throws Exception {
		Class<Person> clazz = Person.class;
		Constructor<Person> constructor = clazz.getConstructor();// 获取空构造方法
		Person person = constructor.newInstance();// 新建实例对象

//		constructor = clazz.getConstructor(String.class, Integer.class, String.class);// 获取带参数的Public构造方法、传入参数类型以确定具体哪一个构造方法 
//		person = constructor.newInstance("zhangsan", 11, "beijing");
		
		constructor = clazz.getDeclaredConstructor(String.class, Integer.class, String.class);// 暴力获取带参数的构造方法、传入参数类型以确定具体哪一个构造方法
		constructor.setAccessible(true);
		//暴力破解必须将Accessible设为True,否则会报Exception in thread "main" java.lang.NoSuchMethodException
		person = constructor.newInstance("zhangsan", 11, "beijing");
		
		Field[] fields = clazz.getDeclaredFields();//暴力或取成员数组
		
		for (Field field : fields) {//便利成员
			System.out.println(field.getName());
		}
		
		Field field=clazz.getDeclaredField("name");
		field.setAccessible(true);//允许暴力获取
		field.set(person, "黑马");;
		System.out.println(person.getName());
		
	}
打印结果:


全能扫描王的实现(python版本)- 目标检测图像矫正 全能扫描王python代码实现,可用于文件扫描或者是图像校正 阅读详情

相关推荐

MATLAB 设置legend加标题

x1 = linspace(0,5); y1 = sin(x1/2); plot(x1,y1) hold on x2 = [0 1 2 3 4 5]; y2 = [0.2 0.3 0.6 1 0.7 0.6]; scatter(x2,y2,'filled') hold off legend({'sin(x/2)','2016'},'Location','northwest','Orientation','horizontal')%水平 legend添加标题 lgd = legend; lgd.Fon

早起CaiCai的学习空间 4714

IOC操作管理中bean的作用域

开发工具与关键技术:Eclipse bean的作用域设置 作者:廖 茂 撰写时间:2020年12月27日 在java开发中,IOC容器的配置文件里的bean实例是有作用范围的,即作用域,bean实例分单实例和多实例,在Spring里面,一般情况下bean实例默认是单实例,那么单实例和多实例如何区分?区分单实例或者多实例是通过重复调用bean实例,如果两次调用的实例的地址值一致,就说明该bean实例是单实例,不一致就是多实例,具体操作如下: 首先创建一个对象类,创建一个属性,并编写该属性的set方法,接

weixin_44540396的博客 371

雪球股票数据接口

周期(day-日,week-周,…表示获取前8个周期(日)数据):类型(before-历史)表示深圳证券交易所,表示上海证券交易所):开始时间戳(一定要。

qq_31856061的博客 6809

学习Object类

文章目录Object类Object类的特点Object类的源码和方法toString和equals方法toString方法equals方法 Object类 Object类的特点 Object类是所有类的默认父类(不需要使用extends显示继承),因此Object类的所有方法(private除外),所有类的对象都能使用 java中对Object做了扩充,Object不仅是所有类的父类,只要是引用类型。都是可以向上转型变为Object类,包括数组和接口。Object类型可以接收所有的引用数据类型 Objec

weixin_45809829的博客 583

AI原生应用在UGC内容审核中的实战经验

AI原生应用(AI-Native Application)——以机器学习模型为核心驱动力,深度整合数据、算法、工程架构的完整系统——为破解这一三角难题提供了全新范式。全链路数据驱动:从数据采集、模型训练到决策优化,形成闭环自治系统,无需人工规则干预多模态深度理解:同时处理文本、图像、音频、视频等多类型内容,理解语义而非简单匹配特征自适应进化能力:通过人机协同反馈持续学习新型违规模式,模型周级迭代成为常态审核效率提升300%:单条视频审核耗时从2.3秒降至0.7秒。

AI算力网络与通信的博客 1150

Realtek 10GbE芯片组解析:低成本高速网络方案

10GbE(万兆以太网)技术通过提升网络带宽,显著改善了数据传输效率,成为现代网络架构的核心组件。其工作原理基于高速串行通信协议,通过优化信号处理和编码技术实现低延迟、高吞吐量。在技术价值上,10GbE不仅满足数据中心和企业网络的高需求,还逐步渗透到消费级市场,推动家庭和小型企业的网络升级。应用场景包括NAS存储、视频编辑工作站和云服务接入等。Realtek最新发布的RTL8127、RTL8159和RTL8261C芯片组,以低功耗和低成本优势,进一步降低了10GbE的普及门槛。这些芯片支持PCIe Gen4

weixin_36427956的博客 589

Java小记——Object类

object类是老祖宗类,所有类直接或间接继承于该类。

m0_63138660的博客 239

MQTT阿里云OTA 调试记录

2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。

qq_42585211的博客 1231

Java基础学习——Java面向对象(六)常用类Object、equals方法、instanceof关键字、类与类的关系

一、Object

skx1102195517的博客 405

10分钟上手YOLOv11:最强姿态估计模型来了,代码开源,效果炸裂!

【10分钟玩转YOLOv11实时姿态估计】🚀 YOLOv11作为YOLO家族最新成员,在速度、精度和易用性上全面升级,尤其适用于姿态估计等复杂视觉任务。本文带您快速掌握: 1️⃣ 核心概念:姿态估计即识别人体17个关键点(如关节部位)并连接成数字骨架,是智能健身、体感游戏等应用的基础。 2️⃣ 技术优势: 超轻量级(最小仅2.9M参数) 极速推理(GPU仅1.7ms) 高精度(COCO mAP@50-95达50%) 3️⃣ 三步实操: ① 安装:pip install ultralytics ② 准备人物

weixin_41246802的博客 1789

强化学习(Q-learning、DQN) —— 理论、案例与交互式 GUI 实现

本文详细介绍了强化学习中基于值函数的 Q-learning 算法及深度强化学习的 DQN 方法,从基本理论、数学模型到算法流程均进行了全面阐述。通过迷宫导航、股票交易策略和机器人控制等典型案例,展示了强化学习在处理高维、非线性和时变问题中的强大适应性。为了帮助工程师和研究者更直观地理解强化学习的训练过程,本文还提供了一份基于 Python 与 PyQt6 实现的交互式 GUI 演示系统代码示例,用户可以在线调整参数,实时观察累计奖励和 Q 值的变化,从而更深入地理解算法收敛和策略演化的过程。

闲人编程的博客 1477

Java-- instanceof 用法详解

instanceof 关键字 instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。 用法 1 boolean result = object instanceof class 参数: result:布尔类型。 object:任意对象表达式。 class:任意已定义的对象类。 说明: 如果 object 是 class 的一个实例,则返回 true。 如果 object 不是指定类的一个实例,或者 objec

时光里的博客 1万+

点云统计滤波 (python详细过程版)【2025最新版】

统计滤波python详细过程版,博客长期更新,本文最近更新时间为:2025年1月12日。

点云侠的博客 5639

Java之反射

1.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于 任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的 方法的功能称为java语言的反射机制。 2.Class类对象的三种实例化模式 在默认情况下我们是根据包名.类名找到类。而反射是根据对象来取得对象的信息来源。 要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所 以先要获取到每一个字节码文件对应的Clas....

柠檬精 4万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

Java 反射

反射(reflection)是 Java 中的一项特性,它允许程序在运行时查询和操作类的信息。即,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性。获取到方法和属性后,就可以对其进行修改。这种动态获取信息以及动态调用对象方法的功能也就是Java的反射机制

2301_76161469的博客 8777

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java反射&python反射

作为一只主学java,次学python的猿,反射的梗,怎能不知道 一、反射是什么: 维基百科上给出的定义:在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 以我浅薄的编程思想理解的反射: 反射可以让我们在不打开程序文件的情况下,清楚的知道该程序的内部结构...

远处 1475

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java 的反射

Java反射机制允许程序在运行时动态获取类信息并操作对象,是Java动态性的核心体现。反射通过Class类获取类结构,包括构造方法、字段和方法,还能创建对象、调用方法和修改字段值。反射支持泛型类型信息获取,广泛应用于框架开发、动态代理等场景。尽管反射功能强大,但性能开销较大,且可能破坏封装性,需谨慎使用。

weixin_73916358的博客 1252

Java 反射体系

Java反射(Reflection)是Java语言的一个重要特性,它允许运行中的Java程序对自身进行检查,并且可以直接操作程序的内部属性。通过反射,我们可以在运行时获取类的信息、创建对象、调用方法以及访问和修改字段等。Java反射体系主要包括以下几个核心类:Class类:代表一个类或接口。每个类都有一个对应的Class对象,该对象包含了类的所有信息,如名称、父类、实现的接口、构造器、方法和字段等。可以通过以下几种方式获得Class类名.class对象.getClass()

weixin_47363690的博客 1512

JAVA反射

Java是先编译再运行的语言,程序中对象的类型在编译期就确定下来了;而当程序在运行时需要动态加载某些类时(这些类因为之前用不到没有被加载到JVM),通过反射可以在运行时动态地创建对象并调用其属性,我们不需要提前在编译期知道运行的对象是谁。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。Java反射机制的本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对象的各种信息。java反射详解。

qq_39239864的博客 959

java反射三种方法_反射及暴力反射

作者:逯小逯出自:SegmentFault 思否原文:segmentfault.com/a/1190000037432381反射一、概述(1)反射的定位是很重要的,JVM和底层框架都离不开反射(2)反射的原理是拿到你的class文件里的数据,进行数据的操作(CURD)(3)反射提供了丰富的方法,来操作类里的各种数据(属性/方法/构造)(4)REflection(反射)是Java程序开发语言的特征之...

weixin_39586353的博客 2390

Java反射概念及类的反射

Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接

wangliaizq10000的专栏 7390

java 反射_反射实例——JAVA反射机制

一、Java反射反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作...

weixin_39713578的博客 139

Java反射之方法反射demo

Java反射之方法反射demo package reflect; import java.lang.reflect.Method; public class ClassDemo3 { public static void main(String[] args) { String s = "hello"; ClassUtil.printClassMethodMessage(s

龙腾四海365的专栏 2693
上一篇: JAVA 解析XML
下一篇: JAVA 枚举、泛型
SetO2
博客等级 码龄12年 5粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值