反射(框架的灵魂)

Java反射机制-框架设计的灵魂 Java反射机制 阅读详情

什么是反射:
反射就是将类的各个组成部分封装为其他对象,这就是反射机制。

我们在编码时定义的类中包括:成员变量,各种方法,构造方法等信息,利用反射技术可以对这个类进行全面的剖析,将这个类的各个组成部分封装为其他的对象。

获取Class对象的方式

  1. Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
  2. 类名.class:通过类名的属性class获取
  3. 对象.getClass():getClass()方法在Object类中定义着。
  • 结论:
    同一个字节码文件(xxx.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。

(ps:包名不应该出现中文的,此处犯了一个小错误)

package com.lp.reflect反射2;

import com.lp.Domain_reflect2.Person;

public class Reflect {
    /**
     * 获取class三种方式
     */
    public static void main(String[] args) throws Exception {

        //第一种:Class.forName("全类名"),返回Class对象

        Class aClass = Class.forName("com.lp.Domain_reflect2.Person");
        System.out.println(aClass);

        //第二种:类名.Class

        Class personClass = Person.class;
        System.out.println(personClass);


        //第三种:对象名.getClass

        Person p = new Person();
        Class  aClass1 = p.getClass();
        System.out.println(aClass1);

        //结论:无论哪种方法获取的class都是同一种。【字节码文件(.class)】只在内存中加载一次。


        if(aClass == personClass && aClass == aClass1 && personClass == aClass1){
            System.out.println("666");
        }


    }
}
package com.lp.Domain_reflect2;

public class Person {
    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 Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }


}


执行结果
在这里插入图片描述

获取类中信息

  • 成员变量,方法,构造方法等
  • 获取这些信息之前先得获取这个类 ,也就是xxx.class

Class对象功能

  • 获取成员变量们

    • Field [ ] getFields() :获取所有public修饰的成员变量
    • Field [ ] getField(String name) 获取指定名称的 public修饰的成员变量
    • Field [ ] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
    • Field [ ] getDeclaredField(String name)
  • 获取构造方法们

    • Constructor [ ] getConstructors()
    • Constructor[ ] getDeclaredConstructors()
  • 获取成员方法们:

    • Method[] getMethods()
    • Method[] getDeclaredMethods()
      注意啦啦啦:(getMethods将返回所有的公共方法,包括从超类继承来的)
  • 获取全类名

    • String getName()

对这些信息的操作

Field:成员变量

1. 设置值
* void set(Object obj, Object value)  
2. 获取值
* get(Object obj) 

Constructor:构造方法

	* 创建对象:
	* 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

Method:方法对象

   * 执行方法:
		* Object invoke(Object obj, Object... args)  
	* 获取方法名称:
		* String getName:获取方法名

终于要来代码了
(我这里继续又犯了个小错误,又出现了汉字)

package com.lp.reflect反射;

import com.lp.Person;

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


public class reflect001 {

    public static void main(String[] args) throws Exception {

        Class c = Person.class;    //获取person的class对象



        System.out.println("-------------------获取成员变量---------------------------");

        Field [] fields = c.getFields();   //获取class c 的public修饰的成员变量

        for (Field field: fields  ) {       //for循环 遍历所有的public修饰的成员变量
            System.out.println(field);

        }

        Field d = c.getField("name");  //获取指定名字的成员变量
        System.out.println(d);


        System.out.println("------------------------获取构造函数--------------------------");


        Constructor [] constructors = c.getConstructors();   //获取所有的构造(无参加有参)方法

        for (Constructor constructor:constructors) {
            System.out.println(constructor);
        }

        Constructor constructor = c.getConstructor(String.class, int.class);  //指定参数的构造方法
        System.out.println(constructor);

        **Object person1 = constructor.newInstance("张三", 25); //constructor可以创建新对象
        System.out.println(person1);**

       


        System.out.println("----------------------获取成员方法--------------------------");
        Method[] methods = c.getMethods();
        for (Method methor: methods) {
            System.out.println(methor);
        }

        Method method_eat = c.getMethod("eat");  //获取指定的成员方法
        Person p = new Person();
        method_eat.invoke(p);      // 执行了eat方法
        //System.out.println(method);


        System.out.println("----------------------获取全类名--------------------------");
        String a = c.getName();
        System.out.println(a);
    }

}


在这我又新建了一个Person类,上文的那个Person类不同了

package com.lp;

public class Person {

    public String name;
    public int age;
    public String sex;

    public String a;

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }


    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public void eat(){
        System.out.println("执行了Person的吃的方法");
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }


}

代码执行结果
在这里插入图片描述
在这里插入图片描述

(转载或引用请标明出处,谢谢)

解密UFS Explorer:Drobo BeyondRAID数据恢复实战指南 本文详细介绍了使用UFS Explorer Professional Recovery软件中的Drobo BeyondRAID助手进行数据恢复的完整实战流程。当Drobo设备因BeyondRAID配置信息丢失而无法访问时,该工具能安全、只读地扫描硬盘,虚拟重建存储池,帮助用户找回宝贵数据。指南涵盖了从前期准备、硬盘选择、配置扫描到数据安全导出的每一步关键操作与常见问题解决方案。 阅读详情

相关推荐

手把手教你用ObjectCRX进行Caxa二次开发:从零开始的环境搭建教程

本文是一份面向零基础初学者的Caxa二次开发实战指南,重点讲解如何使用ObjectCRX框架从零开始搭建开发环境。内容涵盖Visual Studio 2015版本锁定、ObjectCRX向导集成、项目创建、典型错误解决,并最终实现一个可在Caxa中运行的HelloWorld程序,帮助开发者快速入门并避开常见陷阱。

w3x4y的博客 512

2021-03-06——玩转反射在框架中的应用

玩转反射在框架中的应用 前言:谈起反射,就不得不提字节码了,从字节码到反射类加载,到在框架中应用,到手写IOC和DI的实现 1、字节码 字节码文件是一连串的8位字节的二进制流,它包含的数据项是按照固定次序组成的,且相邻的项之间没有间隔。——正因为每一项结构都严格规范,所以才能顺利被解析。 本次使用Java语言来讲述字节文件的结构。话不多说先放图,如下: 对于文件中的16进制代码,除了开头的cafe babe,剩下的内容大致可以翻译成: 啥玩意啊这是...... 英雄莫慌,我们就从我们所能认识

蒙奇D灬小武的博客 1182

Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)

Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建 目录导航Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建前言1.安装前的准备工作2.安装交叉编译器 前言 这篇文章,主要是基于 Ubuntu19.10版本而写,写此文的初衷,是为了自己使用,因为最近正在以Tiny6410板子做实训,所以也是初学者一枚,只能保证我遇上的问题统统能够解决掉,至于一些没遇上的,欢迎各位看客给我留言,大家一起讨论,一起解决。 注:本文会持续更新 1.安装前的准备工作 环境要求 Linux系统:U

繁臻的小窝 4895

框架的灵魂------反射

反射之所以被称为框架的灵魂,是因为它赋予了我们在运行时分析类以及执行类中方法的能力。 通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。 一.反射的应用场景? 像 Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射机制。 这些框架中也大量使用了动态代理,而动态代理的实现也依赖反射。 1.加载数据库驱动 //1.DriverManager DriverManager.registerDriver(new com.mysql.cj.jdbc.D

liaozhongmin_net 1997

每天一个优秀提示词学习收藏 - 文本创作篇(二)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本创作 Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2401

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1890

反射的概念与应用 --框架核心基础

反射 文章目录反射前言一、什么是反射?1.反射的概念1.1 补充1.2 小总结2. 反射的使用3.动态加载二、反射的应用1.访问字段1.1 获取字段值提问:1.2设置字段值 前言 反射是一个Java中很重要的一点,也是面试官常考的考点;同时在后期如果学习到Spring框架时,知晓反射概念更能助你理解框架的原理和奇妙之处。 那么,今天就让我带你理解反射的概念和使用吧 一、什么是反射? 1.反射的概念 当类通过JVM加载到内存以后,会在方法区留下Class文件描述数据(可以理解为Class实例),其中存储了类

qq_44392499的博客 967

记一次在JAVA中客户端使用axis调用webservice服务端出现的异常:Unmarshalling Error: For input string: ""

在使axis调用webservice服务端,参照网上给的demo: Call call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint);//设置服务请求路径 QName qn = new QName(name); call.setOperationName(qn); call.addParamet

kry1201的专栏 8080

反射技术(架构师必备)

一、什么是反射? 先了解一下什么是类?什么是对象? 在现实生活中先存在具体的对象,然后很多对象之间存在对象相似的特征和行为,人们为了描述方便,将具有很多相似特征和行为的对象抽取成类。也就是说类用来描述对象,将对象的的行为和特征都描述出来。 反射则是用来描述类的,在描述类的时候,细分多层:类本身(Flass),类的属性(Field、)、类中的方法(Method)、类的构造方法(Constructor)、类所在的包(Package)重点。 图解反射与类之间的关系二、反射如何描述类 Class:用

因为热爱,所以坚持,记录工作中的乐趣 677

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 1995

【Claude Code】Not logged in 未登录错误解决方案 + /login 认证路径

Claude Code 启动时提示 Not logged in 表示当前会话缺少有效凭证。本文从环境变量、API Key 配置、CI 自动化凭证脚本和系统时钟四个维度,提供完整的认证排查流程与修复方案。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 894

框架的灵魂———反射

前言 写博客也有一段时间了,之前的文章大多是工作中用到什么然后写些什么,没有什么目的性,最近一直在思考填一填之前在学习的时候留下的坑,比如说java的反射,动态代理之类的。只记得学习的时候当时老师说这是重点,反射是框架的灵魂,学习了这个才能更好的理解后面学习的框架,当时只觉的学习了个一知半解。在后面无论是工作或者学习直接面对它的机会还是比较低的,现在反过来想重新巩固一下基础,方便后续对源码的理解。 反射的机制 简单来说就是将类的各个部分封装为其他对象,这就是放射的机制。一下面的一张图来进行简单理解:

梧桐树的博客 405

RAG系统中Embedding模型选型实战

本文详细介绍了RAG系统中Embedding模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Embedding模型API

herosunly的博客 17万+

反射:框架的设计的灵魂

反射:框架的设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化代码。 反射: 将类的各个组成部分封装其他对象,这就是反射机制。 #803400 * 好处: 1.可以在程序的运行的过程中,操作这些对象。 2.可以解耦,提高程序的可扩展性。 获取Class对象的方法: 1. Class.forName(“全类名”):将字节码文件加载进内训,返回Class对象。 多用于配置文件,将类名...

sinat_42759524的博客 224

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

反射:框架设计的灵魂

反射:框架设计的灵魂 1. 框架是什么? 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。 反射:将类的各个组成部分封装为其他对象,这就是反射机制 。 2. Java代码 在计算机中经历的阶段 ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载. classloader 会...

Beware beginning 222

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java反射:框架设计的灵魂

Java反射:框架设计的灵魂 框架:办成品软件,可以在框架的基础上进行开发 反射:将类的各个部分封装成对象,这就是反射机制 反射的好处 在程序运行的过程中,操作这些对象 可以降低程序的耦合性,提高程序的可扩展性 获取class对象的方式 Class.forName(“全类名”):经字节码文件加载进内存,返回class对象 多用于配置文件,将类名定义在配置文件中,读取文件,加载类 ...

紫芝的博客 532

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java反射—框架设计的灵魂

一、框架概念 我们先来说一说什么是框架,框架就好比一个半成品的软件,它提供了一些基础的通用化的组件,可以供开发人员在此基础之上对系统进行开发。 在开发订餐系统PC端和手机端的时候,我们pc端用的是vue框架,手机端用的是ionic框架,vue框架涉及到很多关于事物处理、权限管理、安全性、数据流控制,这些成熟的技术是编写框架的人已经设计好了,而我们开发人员只需要在该框架的基...

有道无术,术尚可求,有术无道,止于术。 465

框架灵魂——反射

反射是框架设计的灵魂!但是本文并不是什么高深莫测的框架设计,只是对 Java 反射机制的一次简单总结。温故而知新,可以为师矣! 引 为什么说反射是框架设计的灵魂?其实在学校 Java SE 的时候,并没有去了解反射机制,第一次听说这个名词是在学习 Spring 的时候,其中有两个重要的概念 IOC (动态加载 Bean)和 AOP (动态代理)就是依靠 Java 的反射机制去实现的。除此之外,还有 JDBC 连接数据库时使用 Class.forName() 通过反射加载数据库驱动程序,JDBC 中还使用反射

qq_42758551的博客 1677

反射乃框架的灵魂

反射乃框架的灵魂 接着昨天的文章,今天言何为反射?反射指的是这部分代码,只有在程序运行时,存在某一动作下,会触发执行。这就会带来,不同触发条件下,带来的结果会不同。 1、回顾JDBCUtils package com.wnx.mall.tiny.fruit.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; im

成长需要沉淀。 1339

框架的灵魂之笔-反射

类加载器、获取类对象的几种方式,反射,暴力破解

小白白O快起来 939

反射——框架设计的灵魂

反射——框架设计的灵魂 * 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 * 反射:将类的各个组成部分封装为其他对象,这就是反射机制 * 好处: 1. 可以在程序运行过程中,操作这些对象。 2. 可以解耦,提高程序的可扩展性。 我们编写的java代码在计算机中会经历三个阶段: 当我们完成一个类的编写,点击运行时,Java代码经历了如下几个过程: 1.编译器会把“类名.j...

zezea的博客 202

Java--反射(框架设计的灵魂)案例

Java--反射(框架设计的灵魂)案例 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 需求 写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 使用 配置文件 反射 步骤 将需要创建的对象的全类名和需要执行的方法定义在配置文件中 在程序中加载读取配置文件 使用反射技术来加载类文件进内存 创建对象 执行方法 配置文件 className=Student me

归子莫的博客 1096

java反射--框架设计的灵魂

反射 定义 通俗的讲,将类的各个组成部分封装为其他对象,这就是反射机制 作用 1. 可以在程序运行过程中,操作这些对象。 2. 可以解耦,提高程序的可扩展性。 原理 先来了解下java代码在计算机中运行的几个阶段: 对应上面的三个阶段,获取Class对象的方式有下面三种: 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 * 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 2. 类名.class:通过类名的属性class获取 * 多用于参数的传

big_white_py的博客 1万+

Java反射机制详解——框架的灵魂所在

Java反射机制详解——框架的灵魂所在ClassClass的获取Class的名字获取修饰符获取Class的成员获取Field获取Method获取Constructor构造器FieldField类型获取获取修饰符Field的读取和赋值Method获取方法名获取方法参数获取返回值类型方法的执行(重点!!!)Constructor 反射作为框架的核心,在Java中处于一个极为重要的地位,而且反射在Java中属于比较高级的技术,需要有对Java一定的理解才可以掌握好。反射可以在程序运行过程中修改程序的行为。但是与此

Tomas_yue的博客 944
上一篇: javaWeb的三层架构图
下一篇: java多线程的创建
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值