返回顶部
首页 > 资讯 > 后端开发 > Python >Java反射机制的简单讲解
  • 588
分享到

Java反射机制的简单讲解

2024-04-02 19:04:59 588人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

🌱1. 什么是反射机制? 首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成JVM识别的字

🌱1. 什么是反射机制?

首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成JVM识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
简单说,反射机制值得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。

🌱2. java反射机制提供了什么功能?

  • 在运行时能够判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任一对象的方法
  • 在运行时创建新类对象

🌱3.new和反射创建有什么区别呢?

new: 静态编译,在编译期就将模块编译进来,执行该字节码文件,所有的模块都被加载;

反射:动态编译,编译期没有加载,等到模块被调用时才加载;

注:springioc就用到反射机制,newInstance创建。更加的通用,并且降低耦合,避免了硬编码,只需提供一个字符串就可以动态的创建。


String className = readfromXMlConfig;//从xml 配置文件中获得字符串

Class c = Class.forName(className);

factory = (ainterface)c.newInstance();

举例:

有自行车🚲,小轿车🚗,

静态:上班将自行车放车里去上班,一定得带着,一个不能落下,

动态:将自行车放家里,交通堵塞骑自行车去,车放家里。

🌱4. 如何通过反射调用私有对象?


Field[] declaredFields = clazz.getDeclaredFields();

for (Field f : declaredFields) {
			System.out.println("属性的名称:" + f.getName());
			System.out.println("属性的类型:" + f.getType().getName());
			// 给属性赋值
			f.setAccessible(true);// 设置为私有属性可以访问

🌱5.如何通过反射调用方法?


		Method m = stuClass.getMethod("show1", String.class);
		System.out.println(m);
		//实例化一个Student对象
		Object obj = stuClass.getConstructor().newInstance();
		m.invoke(obj, "刘德华");

🌱6. class类一部分常用方法总结

  • 获取公共构造器 getConstructors()
  • 获取所有构造器getDeclaredConstructors
  • 获取包含的方法 getMethod()
  • 获取包含的属性 getField(String name)
  • 获取内部类 getDeclaredClasses()
  • 获取外部类getDeclarinGClass()
  • 获取所实现的接口 getInterfaces()
  • 获取修饰符 getModifiers()
  • 获取所在包 getPackage()
  • 获取类名包含包路径 getName()

java反射的简单演示


package com.fjh;

public class Student {
	private String name;
	private int 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 Student(String name, int age) {
		
		this.name = name;
		this.age = age;
	}
	public Student() {
		System.out.println("实例化一个对象!");
	
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
	
}


package com.fjh;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectTest {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException,
			SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		// 普通方法创建一个对象
		Student stu = new Student();
		// 利用反射机制创建一个对象
		Student newInstance = Student.class.newInstance();
		// 通过字节码获取属性
		Class clazz = Student.class;
		// Field field = clazz.getField("name");//指定返回一个公有的属性
		Field field = clazz.getDeclaredField("name");
		System.out.println("属性的名称:" + field.getName());
		System.out.println("属性的类型:" + field.getType().getName());

		System.out.println("---------------------");
		// 获取一个类中的所有属性
		Field[] declaredFields = clazz.getDeclaredFields();
		for (Field f : declaredFields) {
			System.out.println("属性的名称:" + f.getName());
			System.out.println("属性的类型:" + f.getType().getName());
			// 给属性赋值
			f.setAccessible(true);// 设置为私有属性可以访问

			if (int.class == f.getType()) {
				f.set(newInstance, 50);
			} else if (String.class == f.getType()) {
				f.set(newInstance, "蔡徐坤");
			}
		}
		System.out.println("========通过直接赋值后的结果==========");
		System.out.println(newInstance);
		
		System.out.println("========获取所有方法==========");

		// 获取所有方法 不包括构造方法
		Method[] methods = clazz.getDeclaredMethods();
		for (Method method : methods) {
			String methodName = method.getName();// 参数名称
			int parameterCount = method.getParameterCount();// 参数个数
			System.out.println("方法名字:" + methodName);
			System.out.println("方法参数个数:" + parameterCount);
			Class<?>[] parameterTypes = method.getParameterTypes();
			// 获取每个方法的参数类型
			for (Class<?> class1 : parameterTypes) {
				System.out.println("参数类型:" + class1.getName());
			}

			// 获取方法的返回值
			Class<?> returnType = method.getReturnType();
			System.out.println("方法的返回值为:" + returnType.getName());
			System.out.println("-------------------");
		}

		// 执行获取到的 方法
		// 如果方法参数有多个,则需要用字节码数组来代替
		// Method declaredMethod = clazz.getDeclaredMethod("setName", new
		// Class[]{String.class,int.class});
		// 执行方法同样使用数组
		// declaredMethod.invoke(newInstance,Object[]{"mayun",20} );
		Method declaredMethod = clazz.getDeclaredMethod("setName", String.class);// 返回当前Class对象表示的类或接口的指定已说明的一个方法对象。
		declaredMethod.invoke(newInstance, "马云");
		System.out.println("==========设值注入=========");
		System.out.println(newInstance);

		// 构造函数
		Constructor constructor = clazz.getConstructor(new Class[] { String.class, int.class });
		// 如何执行构造函数
		Object obj = constructor.newInstance(new Object[] { "周杰伦", 46 });
		System.out.println("==========构造注入=========");
		System.out.println(obj);
		
		System.out.println("==========构造方法=========");
		//获取所有的构造函数
		Constructor[] constructors = clazz.getConstructors();
		for (Constructor c : constructors) {
			if(c.getParameterCount() != 0){
				Class[] parameterTypes = c.getParameterTypes();
				for (Class class1 : parameterTypes) {
					System.out.println("参数类型:"+class1.getTypeName());
				}
				System.out.println("-------------------");
			}else{
				System.out.println("无参构造");
				System.out.println("-------------------");
			}
		}
	}

}

🌱7. 结果

在这里插入图片描述

在这里插入图片描述

到此这篇关于Java反射机制的简单讲解的文章就介绍到这了,更多相关Java反射机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java反射机制的简单讲解

本文链接: https://lsjlt.com/news/129573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java反射机制的简单讲解
    🌱1. 什么是反射机制? 首先大家应该先了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字...
    99+
    2024-04-02
  • Java的反射(reflection)机制的简单使用
    目录 一、定义 二、用途 三、反射基本信息 四、反射相关的类 五、反射示例 六、反射的优点和缺点 一、定义         Java的反射机制是运行时的状态,可以通过反射来调用类里面的属性和方法,私有的属性和方法也可以调用,也可以对它...
    99+
    2023-10-27
    1024程序员节 java
  • Java深入分析讲解反射机制
    目录反射的概述获取Class对象的三种方式通过反射机制获取类的属性通过反射机制访问Java对象的属性反射机制与属性配置文件的配合使用资源绑定器配合使用样例通过反射机制获取类中方法通过...
    99+
    2024-04-02
  • 简单谈谈python的反射机制
      对编程语言比较熟悉的朋友,应该知道“反射”这个机制。Python作为一门动态语言,当然不会缺少这一重要功能。然而,在网络上却很少见到有详细或者深刻的剖析论文。下面结合一个web路由的实例来阐述pytho...
    99+
    2022-06-04
    反射 机制 简单
  • PHP反射机制案例讲解
    简介 就算是类成员定义为private也可以在外部访问,不用创建类的实例也可以访问类的成员和方法。 PHP自5.0版本以后添加了反射机制,它提供了一套强大的反射API,允许你在PHP...
    99+
    2024-04-02
  • Python反射机制实例讲解
    目录1. 反射的四个函数2. 类的反射操作3. 当前模块的反射操作4. 其他模块反射操作5. 反射应用场景之一6. 反射应用场景之二7. 总结通常,我们操作对象的属性或者方法时,是通...
    99+
    2024-04-02
  • GoLang反射机制深入讲解
    目录反射反射类型Type指针结构体反射值Value结构体空与有效性判断修改值函数调用反射三定律interface底层结构ifaceeface反射 Go语言提供了reflect 包来访...
    99+
    2022-12-23
    GoLang反射 Go反射机制
  • Java反射机制详解
    目录类的声明周期不同阶段都可以获取类对象获取Class类对象的方式的场景class类对象的功能如何获取私有变量的值根据有无主方法判断进程和线程反射出现的背景(记住)反射出现的背景类的...
    99+
    2024-04-02
  • Java 反射机制
    简介: Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个...
    99+
    2024-04-02
  • JAVA中反射机制和模块化的深入讲解
    目录一.类加载1.1类加载描述1.2类的加载1.3类的连接1.4类的初始化        1.4.1类...
    99+
    2024-04-02
  • Java中的反射机制详解
    目录一、什么是反射?二、为什么要用反射三、Class类四、获取Class类对象的四种方式五.通过反射构造一个类的实例①使用Class.newInstance②通过反射先获取构造方法再...
    99+
    2024-04-02
  • java反射机制最详解
    目录java反射机制什么是反射?反射的功能:反射常用类:1.Class枚举类2.Constructor构造器3.Method方法类4.Field变量类反射运行指示图通过反射获取对象总结java反射机制 什么是反射? 在java开发中有一个...
    99+
    2020-08-07
    java java反射机制
  • Java-反射机制(超详解)
    Java反射机制概述 前言一、Java反射机制概述1. Java Reflection2. 动态语言 vs 静态语言 二、 Class类的理解1. 类的加载过程1.1 初步了解1.2 类的加载过程图解1.3 了解:什么时候会发...
    99+
    2023-08-17
    java 开发语言
  • Java实例讲解反射机制是怎么一回事
    Java反射机制的概述 1.Java的反射(reflection) :机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量...
    99+
    2024-04-02
  • Java 反射机制的实例详解
    Java 反射机制的实例详解前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文 Java反射机制定义Java反射机制是指在运行状态中...
    99+
    2023-05-31
    java 反射机制 ava
  • Python反射机制案例超详细讲解
    目录一、导包案例二、基础知识1、是什么2、怎么用三、使用案例一、导包案例 我们导入第三方库,可以使用import。那我们现在有一个需求,我需要动态输入一个模块名,然后导入,这应该怎么...
    99+
    2024-04-02
  • Java反射机制基础详解
    目录1、什么是Java反射机制?2、反射机制原理3、Class类介绍3.1、Class类基本介绍3.2、Class类对象的获取方法Class.forname()3.3、可以获取Cla...
    99+
    2024-04-02
  • Java反射机制深入理解
    Java反射机制深入理解一.概念   反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private,由JVM创建。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成...
    99+
    2023-05-31
    java 反射机制 ava
  • Java反射机制怎么理解
    本篇内容主要讲解“Java反射机制怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java反射机制怎么理解”吧! 简介定义:Java语言中 一种动态(运行时)访问、检测 & 修改它...
    99+
    2023-06-03
  • Java反射机制介绍
    1.通过反射,我们可以构建实例,得到成员变量的值,得到方法并调用。 还可以获得定义在成员变量、方法、方法参数上的注解。 接下来看代码实现,然后讲原理。 1)构建无参实例:通过反射调用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作