反射--简单入门讲解

JAVA中的反射,什么是反射,怎么理解反射(保姆级、代码、图文讲解) 反射、java 阅读详情

一、反射的概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

反射的前提就是获取到类的字节码对象,有以下三种方式(以Student类来举例):

        //第一种:通过类的路径来获取
        Class<?> c1 = Class.forName("cn.tedu.reflection.Student");
        //第二种:通过类名点class来获取
        Class<?> c2 = Student.class;
        //第三种:通过创建对象调用getClass方法来获取
        Class<?> c3 = new Student().getClass();

注意:一般用第一种,第一种需要类填入路径,它是一个字符串,可以传入也可写在配置文件中等多种方法。第二种需要导入类的包,依赖太强,不导包就抛编译错误。第三种对象都有了还要反射作什么.......。

二、反射的实际操作以及API的使用

常用API:

        Class<?> c1 = Class.forName("cn.tedu.reflection.Student");

        System.out.println(c1);//打印字节码对象
        System.out.println(c1.getName());//获取类的全路径名
        System.out.println(c1.getSimpleName());//获取类名
        System.out.println(c1.getPackage());//获取包对象
        System.out.println(c1.getPackage().getName());//获取包名

实战用反射获取类里的内容:

普通反射:

1.创建物料类Student

package cn.tedu.jobo;
public class Student {
    public String name;
    public int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public void cool(){
        System.out.println("coolboy 阎静辉");
    }
    public void like(String name,int age){
        System.out.println("我老婆是:"+name+"她"+age+"岁了");
    }
}

2.创建反射测试类进行内容获取

 //构造方法
    @Test
    public void getConstrct(){
        Class<Student> c = Student.class;
        Constructor<?>[] constructors = c.getConstructors();
        for (Constructor<?>  con:
             constructors) {
            System.out.println(con.getName());
            Class<?>[] parameterTypes = con.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));
        }
    }

    //普通方法
    @Test
    public void getMethod(){
        Class<Student> c = Student.class;
        Method[] methods = c.getMethods();
        for (Method m :
                methods) {

            System.out.println(m.getName());
            Class<?>[] parameterTypes = m.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));

        }
    }

    //成员变量
    @Test
    public void getFields(){
        Class<Student> c = Student.class;
        Field[] f = c.getFields();
        for (Field i :
                f) {
            System.out.println(i.getName());
            System.out.println(i.getType().getName());
        }
    }

    //创建对象并调用方法
    @Test
    public void getnewInstance() throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Class<Student> c = Student.class;
        //无参
        Student student = c.newInstance();
        System.out.println(student);

        //含参
        Constructor<Student> cs = c.getConstructor(String.class,int.class);
        Student zzf = cs.newInstance("张子枫", 19);
        System.out.println(zzf);
        System.out.println(zzf.age);
        System.out.println(zzf.name);
        zzf.cool();
        zzf.like("张子枫", 19);
    }
}

注意点:

       1. 单元测试

                        好处:只涉及一个方法,使用灵活,方便
                        格式:@Test+public+void+无参

        2.八大基本类型会直接显示,引用类型会显示全路径

        3.通过含参构造来new对象需要先获取到这个指定的构造函数,且传入的参数必须是字节码对象

        4.普通反射只能获取到public的方法和成员变量

暴力反射:

1.创建物料类Person

package cn.tedu.jobo;
public class Person {
    private String name;
    private int age;
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    private void play(){
        System.out.println("玩");
    }
    private void eat(String su,int n){
        System.out.println("我喜欢吃:"+su+"我要吃"+n+"个");
    }
}

2.创建暴力反射测试类进行内容获取

package cn.tedu.controller;
//暴力反射
import cn.tedu.jobo.Person;
import org.junit.Test;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
public class TestPerson {
    //获取私有成员变量
    @Test
    public void getField() throws NoSuchFieldException, InstantiationException, IllegalAccessException {
        Class<?> p = Person.class;
        Field[] fs = p.getDeclaredFields();
        for (Field f :
                fs) {
            System.out.println(f.getName());
            System.out.println(f.getType().getName());
        }
        //设置成员变量
        Field name = p.getDeclaredField("name");
        name.setAccessible(true);
        Object o = p.newInstance();
        name.set(o, "阎静辉");
        System.out.println(name.get(o));
    }

    //暴力反射获取使用私有方法
    @Test
    public void getMethod() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class<Person> p = Person.class;
        Method[] declaredMethods = p.getDeclaredMethods();
        for (Method d :
                declaredMethods) {
            System.out.println(d.getName());
            Class<?>[] parameterTypes = d.getParameterTypes();
            System.out.println(Arrays.toString(parameterTypes));
        }

        Method eat = p.getDeclaredMethod("eat", String.class, int.class);
        eat.setAccessible(true);
        Person person = p.newInstance();
        eat.invoke(person,"米饭",1);
    }
}

注意点:

        1.Declared暴力反射时需要添加

        2.暴力反射时需要手动设置私有资源可见的权限setAccessible(true)

        3.set和invoke的区别使用

        4.思想的转变:平常是通过对象名点属性获取值,反射就是反过来通过属性名点对象名和参数传入,通过方法名点哪个对象来执行加传入参数。

另外两种修饰符暴力反射获取

上述只讲了对于public和private权限修饰符的两种方法:普通反射和暴力反射的使用

对于另外两种默认(default)和protected权限修饰符同样可以用暴力反射来获取,示例如下:

1.物料类hhh

package cn.tedu.jobo;
public class hhh {
    public String name;
    protected int age;
    double dog;
    private char pig;
}

2.创建暴力反射测试类进行测试

package cn.tedu.controller;
import cn.tedu.jobo.hhh;
import org.junit.Test;
import java.lang.reflect.Field;
public class Testhhh {
    @Test
    public void getfields(){
        Class<hhh> h = hhh.class;
        Field[] declaredFields = h.getDeclaredFields();
        for (Field f :
             declaredFields) {
            System.out.println(f);
        }
    }
}

3.结果如下

public java.lang.String cn.tedu.jobo.hhh.name
protected int cn.tedu.jobo.hhh.age
double cn.tedu.jobo.hhh.dog
private char cn.tedu.jobo.hhh.pig

兄弟盟,到这里就结束了,有不对的地方和需要补充的评论或者私信留言!

fighting!

fighting!!

fighting!!!

C++ 反射机制(实例讲解) C++反射机制 阅读详情

相关推荐

【Unity Shaders】Reflecting Your World —— Unity3D中简单的Cubemap反射

写在前面 通过上一节,我们已经知道如何创建我们自己的Cubemaps,现在,我们可以来看一下如何使用这种新的贴图类型来在Shaders中模拟反射效果。使用Cubemaps进行反射的原理实际上非常简单,但是这将给你的Shader效果带来翻天覆地的变化。它的原理主要是通过模型表面的每个顶点的法向量,去查找Cubemap贴图上的某一个位置。这种查找将会返回一个颜色值,来模拟这个Cubemap反

candycat 2万+

利用反射获取一个类中的所有方法和该方法的参数

因为平时用反射很少,之前一次面试被问到反射这块的一个问题,很简单,当时给了个不是很确切的答案,回家之后也忘了去找出这个问题的答案,今天手头上的工作比较闲,就把之前的那个问题给解决下。 被问到的是,我只知道一个类和他其中的一个方法,不知道方法的参数情况,我怎么定位到这个方法?这个问题我想到的就是反射获取这个类的所有方法,然后去找它的参数(当时不确定有方法能获取参数类型),在反过来调用这个方法。然后

wal1314520的博客 2万+

IDEA 2023.2.3全平台安装指南:Mac/Windows/Linux一键激活(附最新补丁获取)

本文提供IDEA 2023.2.3在Mac、Windows和Linux三大平台的一键安装与激活指南,包含最新补丁获取方法。详细讲解各系统安装流程、性能调优设置及高效开发技巧,帮助开发者快速配置并提升工作效率。

weixin_28832121的博客 398

Java反射--反射与类操作

内容学习于:edu.aliyun.com 1. 反射获取类结构   使用Class实现了对象实例化,并且通过Class类反射构造了类的实例化对象,但是这并不意味着这些全部都属于反射机制的功能,如果认真去分析的话,实际上反射可以完整的实现Java允许规定的类的操作形式。   如果在日后的开发之中你突然发现需要对二进制文件做更深入的一层分析的时候,那么此时你有两个选择: 选择一:通过Oracl...

xzzz2020的博客 612

FPGA图像处理之直方图均衡实现

直方图均衡的基本原理,就是对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行拉伸,而对像素个数较少的灰度值(即对画面不起主要作用的灰度值)进行合并,从而提高对比度,使图像清晰,达到增强的目的。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。

FZWzsl的博客 1429

开关电源补偿设计避坑手册:为什么你的Buck电路总在轻载时振荡?

本文深入剖析了Buck电路在轻载时发生振荡的根本原因,并提供了专业的补偿设计避坑指南。文章指出,轻载下输出滤波器Q值飙升、DCM模式切换导致的小信号模型剧变是主要诱因,并详细对比了Type II与Type III补偿网络在宽负载范围内的表现差异。通过结合LTspice仿真与工程实践,指导工程师如何优化补偿环路设计,确保电源从满载到空载的全程稳定。

hadoop5ranger的博客 676

Java反射机制(只可以访问公有的方法或者变量)

1.ji什么是Java的反射? 要让Java程序能够运行,就得让Java类被Java虚拟机加载。Java类如果不被Java虚拟机加载就不能正常运行。正常情况下,我们运行的所有的程序在编译期时候就已经把那个类被加载了。 Java的反射机制是在编译时并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用的是在编译期并不知道的类。这样的编译特点就是ja...

weixin_30908103的博客 203

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

关于VSCode上搭建C/C++开发环境的内容,到这里就结束了,这里博主感叹一下,VSCode真的挺强大的,作为一个编辑器,可以通过和编译器链接成为开发环境,将环境配置好的话,在这上面写代码似乎也是个不错的选择。大家有任何疑问,欢迎在评论区中提出,本篇博客有任何问题和错误也欢迎来和博主讨论,真心希望能和大家一起进步。最后,如果本篇博客对你有帮助的话,能不能给博主一个三连啊!

2303_79329831的博客 8万+

java反射机制第一讲,什么是反射,为什么要用到反射

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

zlj20xz的博客 1070

【SAP HANA 24】HANA与Oracle SQL语法对照表

HANA SQL参考及Oracle 语法对照

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 1426

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box。

成长需要沉淀。 397

第五十九讲 反射

有一段时间没有接触反射了,Java Web学的越深,深刻认识到反射的重要性,所以今天抽空来复习一下反射,记录如下。 有关类的加载 类加载的步骤 当程序要使用某个类时,如果该类还未被加载到内存中,则系统(JVM)会通过加载,连接,初始化三步来实现对这个类进行初始化,也即一个类的加载步骤。 类加载的时机(类什么时候加载到内存中去) 类加载器 类加载器的作用是负责将class文件加载到内存中,并为之...

李阿昀的博客 866

Lasso的原理及其与其他特征选择方法的比较进行阐述,然后讨论Lasso优点、缺点以及应用场景,最后给出了代码实例

在机器学习领域中,特征选择(feature selection)是指在模型训练前对数据集进行分析,选择其中有助于预测目标变量或影响模型性能的特征,去除不相关或冗余的特征,提升模型的泛化能力。而Lasso回归是一种很流行的用于特征选择的方法之一。Lasso回归(又称LASSO,least absolute shrinkage and selection operator)是一种线性模型中的特征选择方法。

AI天才研究院 3052

Java反射(简单详细且易懂,快速入门)

Java反射是Java语言的一种特性,它允许程序在运行时自我检查并对内部成员进行操作。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。具体来说,反射机制允许在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,并且能改变它的属性。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。其本质是JVM得到Class对象之后,再通过Class对象进行反编译,从而获取对象的各种信息。

qq_64997449的博客 1万+

如何用 Claude Code 做大型项目重构与架构优化

本文介绍了如何利用Claude Code参与大型项目重构。文章指出,大型项目重构的最大难点在于理解系统结构和控制风险,而非单纯修改代码。作者提出了五步重构法:首先分析项目结构,其次梳理模块依赖关系,然后发现架构问题,接着设计分阶段重构方案,最后逐步实施。重点强调了Claude Code的核心价值在于帮助开发者理解复杂系统、分析模块依赖、发现结构问题、评估改动风险,而非仅作为代码生成工具。文章建议将Claude Code作为架构助手,通过分阶段小范围重构来降低风险,而非一次性全面重构。

sg_knight的专栏 1574

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

反射方法 的简单使用

反射方法 的简单使用 文章目录反射方法 的简单使用获得字节码文件对象的三种方式用字节码文件对象来构建一个类的对象构造方法对象方法对象得到属性对象 获得字节码文件对象的三种方式 Object类的getClass方法 类型.class 属性 Class.forName(“类的路径”) 都为true,内存地址是一样的。在程序的运行中,Person的class文件只被加载了一次。 也为true,可知只加载了一次 也为true 用字节码文件对象来构建一个类的对象 字节码文件对象中包含: 那么

qq_29310729的博客 3565

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java反射,枚举讲解

枚举是在JDK1.5以后引入的。和之前C语言中学习过的枚举常量类似,都是将一组常量有序组织起来的集合在这之前定义常量的方式使用枚举常量本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认继承了 这个类。直接将枚举类型定义为一个类//拿到枚举实例BLACK//拿到枚举实例RED。

Mylvzi的博客 1176

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

谈谈Java反射:从入门到实践,再到原理

前言反射是Java底层框架的灵魂技术,学习反射非常有必要,本文将从入门概念,到实践,再到原理讲解反射,希望对大家有帮助。反射理解官方解析Oracle 官方对反射的解释是:Reflecti...

weiwenhou的博客 1172

Java 反射讲解

定义一个实体类return age;获取当前创建类的实力对象创建多个看看是否是同一个对象值相等:说明创建出来的实力都是同一个(一个类在内存中只有一个Class对象)通过上面的测试可以看出来,直接通过对象调用的方式效率会高很多,而反射的方式,相对于关闭检测后,效率也会有所提升。在代码中要是用反射的情况较多的情况下,就是建议关闭检测,提高效率。

HUAIJIUdada的博客 1264

Java反射的简单入门

摘自jdk1.8中文版,刚开始看可能不懂,现在逐句来解释一下。第一句话:一个类被加载以后,JVM就会在内存中给创建一个对应类的Class对象。第二句话:类型相同的对象,维数相同的数组(不管长度)共享的是同一个内存中的Class对象。第三句话:上面这些原始的类型,也会在内存中有一个与之对象的Class对象。/**Class的简单使用方法*/@Testtry {// 第一种获取Class对象的方法// 第二种获取Class对象的方法//第三种获取Class对象的方法。

2401_86963632的博客 833

什么是反射,为什么要用反射,反射的知识讲解

面试难免让人焦虑不安。经历过的人都懂的。但是如果你提前预测面试官要问你的问题并想出得体的回答方式,就会容易很多。此外,都说“面试造火箭,工作拧螺丝”,那对于准备面试的朋友,你只需懂一个字:刷!给我刷刷刷刷,使劲儿刷刷刷刷刷!今天既是来谈面试的,那就必须得来整点面试真题,这不花了我整28天,做了份“Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法等”

2401_85358130的博客 1093

Java反射入门:用简单案例理清核心用法

/ 私有字段private String sex = "男";// 私有字段// 公共字段// 默认访问权限字段// 受保护字段// 重载方法:方法名相同,参数列表不同System.out.println("公共带参run方法:" + name);System.out.println("私有无参run方法");void flay(Integer age, String phone) { // 默认权限。

2201_75940978的博客 1129

C#反射的应用案例与讲解

反射在我们实际开发中其实比较常见的,比如我们接口对接时将对象序列化为json字符串和将对方传过来的json字符串序列化为我们的DTO对象,还有进行依赖注入的时候其实都用到的反射。下面我就来用实际开发案例的方法来给大家讲解一些C# 反射的用法和原理。其实有的时候我也在考虑有没有必要这样刨根问底,换个思考方式就像铁匠去研究锤子的铁是由什么元素组成的一样,其实他就是个打铁的根本没必要去做这些事只要打好自己的铁就可以了。但是古人又说了,不能知其然要知其所以然。奇奇怪怪。

技术分享博客 1179

Java反射讲解与案例实战

Java反射讲解与案例实战

MemoForward的博客 794

Java反射入门、简单实用【一篇就够】

摘自==》http://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。 Apple apple = new Apple(); ...

sjmz30071360的专栏 201

java反射讲解及反射优化

前言:反射是java语言的重要一部分,反射可以在运行期间动态执行访问类,方法及字段,会大大提高框架的灵活性,所以像很多开源框架大量使用反射动态生成对象,例如spring的bean,mybatis的mapper。但反射的性能一直是被诟病的。 java中创建对象有几种方式? 1.使用new关键字 2.使用clone方法 3.使用反序列化4.使用反射 5.使用Unsafe 1.一个小demo,使用反射实例化对象并且调用该对象里的方法 1.1 定义一个Student对象 /** * @Author feng

the shy 1323
上一篇: VUE简单了解学习!
下一篇: MVC的学习与实战
希望不要秃头的0.0
博客等级 码龄6年 64粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值