简单说明反射和new的区别和反射的使用代码展示

面试题:Java反射和new效率对比,差距有多大? Method#invoke 方法会对参数做封装和解封操作需要检查方法可见需要校验参数反射方法难以内联JIT 无法优化。 阅读详情

目录

1.反射的认识

2.反射和new的区别

3.反射的使用代码展示

4.反射优点和缺点


1.反射的认识

反射是Java语言的一种机制,它允许程序在运行时检查和操作类、方法、字段等信息,而不需要提前知道它们的具体定义。通过反射,我们可以在运行时动态地加载类、创建对象、调用方法以及访问和修改字段。

 Java反射提供了以下核心类:

细说: 

(1)Class类:代表Java中的类或接口。通过Class类,我们可以获取类的构造函数、方法、字段等信息。

(2)Constructor类:代表类的构造函数。通过Constructor类,我们可以创建对象。

(3)Method类:代表类的方法。通过Method类,我们可以调用方法。

(4)Field类:代表类的字段。通过Field类,我们可以访问和修改字段的值。

  Java 文件被编译后,生成了 .class 文件, JVM 此时就要去解读 .class 文件 , 被编译后的 Java 文件 .class 也被 JVM 解析为 一个对象,这个对象就是 java.lang.Class . 这样当程序在运行时,每个 java 文件就最终变成了 Class 类对象的一个实 例。我们通过Java 的反射机制应用到这个实例,就可以去 获得甚至去添加改变这个类的属性和动作 ,使得这个类成 为一个动态的类。

2.反射和new的区别

仅仅在实例化对象上效果无区别,接下来我会列举一些反射和new重要的区别(不阐述底层原理,只区分不同)

(1)首先new出来的对象我们无法访问其中的私有属性,但是通过反射出来的对象我们可以通过setAccessible()方法来访问其中的私有属性。

(2)new对象一定要知道类名(在不知道类名的情况下,你怎么去new?),但反射创建对象不需要知道类名也可以。

(3)new对象属于静态编译,也就是说当代码生成exe文件的时候会将所有模块都编译进去,当你启动这个exe文件的时候,所有模块就会进行一个加载的过程(初始化)

 反射属于动态编译,编译过程中并不会将模块编译进去,这样初始化的时候就会减少负荷,只有在运行过程中,需要哪些模块的时候才进行调用.


3.反射的使用代码展示

我们先看看Class类中的相关方法

(1)常用获得类相关的方法

(2)常用获得类中属性相关的方法(以下方法返回值为Field相关)

(3) 获得类中注解相关的方法

(4)获得类中构造器相关的方法(以下方法返回值为Constructor相关)

 (5) 获得类中方法相关的方法(以下方法返回值为Method相关)

在反射之前,我们需要做的第一步就是先拿到当前需要反射的类的Class对象,然后通过Class对象的核心方法,达到反射的目的,即:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息

接下来展示代码需要导入的包:

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


3.1获得Class对象的三种方式

student类

class Student {
    //私有属性name
    private String name = "wang";
    //公有属性age
    public int age = 18;
    //不带参数的构造方法
    public Student(){
        System.out.println("Student()");
    }

    private Student(String name,int age) {
        this.name = name;
        this.age = age;
        System.out.println("Student(String,name)");
    }

    private void eat(){
        System.out.println("i am eat");
    }

    public void sleep(){
        System.out.println("i am pig");
    }

    private void function(String str) {
        System.out.println(str);
    }

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

 Text类

public class Test {

    /*
    Class对象 只有一个
     */
    public static void main(String[] args) {
        Class<?> c1 = null;
        try {
            c1 = Class.forName("demo1.Student");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Class<?> c2 = Student.class;

        Student student = new Student();
        Class<?> c3 = student.getClass();

    }
}

说明:

(1)直接通过 类名 .class 的方式得到 , 该方法最为安全可靠,程序性能更高
这说明任何一个类都有一个隐含的静态成员变量 class
(2) 通过 Class 对象的 forName() 静态方法来获取,用的最多,
但可能抛出 ClassNotFoundException 异常, 注意这里是类的全路径,如果有包需要加包的路径

思考: 

提问: 关于Text类
        System.out.println(c1 == c2);
        System.out.println(c1 == c3);

答案:ture     ture

因为:Class对象 只有一个 ,一个类在 JVM 中只会有一个 Class 实例

接下来我们开始使用反射,我们依旧反射上面的Student类,把反射的逻辑写到另外的类当中进行理解

以下均为简单操作,故不做过多说明。

3.2反射机制创建对象

代码:

 public static void reflectNewInstance() {
        Class<?> classStudent = null;
        try {
            classStudent = Class.forName("demo1.Student");
            Student student = (Student)classStudent.newInstance();
            System.out.println(student);
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

通过反射机制调用构造方法实例化java对象

代码:

 public static void reflectPrivateConstructor() {
        Class<?> classStudent = null;
        try {
            classStudent = Class.forName("demo1.Student");
            //获得构造方法
            Constructor<?> constructor = classStudent.getDeclaredConstructor(String.class,int.class);
            constructor.setAccessible(true);
            Student student = (Student)constructor.newInstance("xiaoming",15);
            System.out.println(student);
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

 小结:

  1. 先获取到这个有参数的构造方法【用ClassgetDeclaredConstructor()方法获取】
  2. 调用构造方法new对象【用Constructor类的newInstance()方法new对象】

3.3通过反射机制访问一个java对象的属性

代码:

    public static void reflectPrivateField() {
        Class<?> classStudent = null;
        try {
            classStudent = Class.forName("demo1.Student");
            Field field = classStudent.getDeclaredField("name");
            field.setAccessible(true);
            Student student = (Student)classStudent.newInstance();

            field.set(student,"caocao");

            System.out.println(student);


        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

    }

3.4通过反射机制调用一个对象的方法

代码:

 public static void reflectPrivateMethod() {
        Class<?> classStudent = null;
        try {
            classStudent = Class.forName("demo1.Student");
            Method method = classStudent.getDeclaredMethod("function",String.class);
            method.setAccessible(true);
            Student student = (Student)classStudent.newInstance();
            method.invoke(student,"我是一个反射的参数!");
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }

    }

4.反射优点和缺点

优点:

(1)对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法

(2)增加程序的灵活性和扩展性,降低耦合性,提高自适应能力

(3)反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。

缺点:

(1)使用反射会有效率问题。会导致程序效率降低。具体参考这里:反射效率低的原因

(2)反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 


以上为我个人的小分享,如有问题,欢迎讨论!!! 

都看到这了,不如关注一下,给个免费的赞 

Dynamics 365从入门到精通:一站式掌握微软智能商业应用平台 很多新手学Dynamics 365时,容易陷入“死记功能”的误区,其实这款平台的核心价值不是“功能多全”,而是“能适配企业业务流程,通过生态集成提升效率”。先从具体业务场景入手,理解每个功能的实际价值;再通过生态集成拓展系统能力;最后通过开发实现定制化,满足企业的特殊需求。按照这个思路,新手不用害怕复杂,一步步落地实战,3个月就能从“入门”到“能独立负责项目”。如果在学习过程中遇到具体问题(比如部署报错、数据迁移失败),欢迎在评论区留言,我会结合实战经验帮你解答! 阅读详情

相关推荐

【Mac+CLion+STM32+JLink】从零到一:在macOS上构建高效STM32开发与调试工作流

本文详细介绍了在macOS上使用CLion、STM32CubeMX和JLink搭建高效STM32开发与调试工作流的完整指南。从环境准备、CLion深度配置到STM32CubeMX工程实战,再到JLink烧录避坑和串口调试技巧,帮助开发者快速掌握Mac平台下的嵌入式开发全流程。

weixin_28278377的博客 254

java new和反射对比

很难过。逛了一圈。还是不太清晰反射和new在执行过程中的本质区别。 说上new和反射的区别。都可罗列一堆。 new是静态编译,在类进行编译的时候吧所有模块都编译到exe了。当启动这个exe的时候所有模块都加载进入内存。 反射是动态编译。编译时没有把模块编译到一起,启动程序的时候也不会加载,而是在运行时用到那个模块就调用哪个模块。 所以RTTI和反射之间真正的区别只在于,对RTTI来说,编译器在编译时打开和检查.class文件。(换句话说,我们可以用“普通”方式调用对象的所有方法。)而对于反射机制来说,.c

qq_50280152的博客 1634

HDMI 2.1超高清传输背后的“隐形功臣”:深入浅出图解VESA DSC压缩核心流程

本文深入解析HDMI 2.1超高清传输中的VESA DSC压缩技术,揭示其如何在不损失画质的前提下实现带宽减半。通过切片并行处理和智能算法,DSC技术有效解决了8K/4K高帧率视频的传输瓶颈,成为现代显示设备不可或缺的“隐形功臣”。

weixin_30615767的博客 423

反射得到的对象和new的对象区别

原文链接:https://blog.youkuaiyun.com/weixin_42294335/article/details/80439785 1. 在使用反射的时候,必须确保这个类已经加载并已经连接了。使用new的时候,这个类可以没有被加载,也可以已经被加载。 2. new关键字可以调用任何public的构造方法,而反射只能调用无参构造方法。 3. new关键字是强类型的,效率较高。反射是弱...

习惯成自然 9800

Camera metadata

Camera metadata

weixin_42136255的博客 2529

OpenLayers源码解析1 Map.js

Map.js 父类:./PluggableMap/PluggableMap 引用:5个模块 ./renderer/Composite.js ./PluggableMap.js ./obj.js ./control.js(控件) ./interaction.js(交互) 主要功能:核心组件,渲染地图 必要参数: view layers target controls和interactions要是未指定,使用默认值 方法:createRenderer()? /** * @module ol/Map */ i

qq_45005996的博客 1898

JAVA之new一个对象和利用反射创建一个对象的区别

但是随着我们技术的不断提升,我们也学习到了,可以通过反射技术实现对象的创建。反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。new的对象无法访问其中的私有属性,反射出来的可以通过设置setAccessible()方法来省略访问权限符。用法解释:其实就是构造get和set构造器的方法名,然后通过invoke方法实现真正的设置值。从结果我们可以看出创建对象new方法更快一些,那反射的优点在哪里?可以在运行时改变类的属性值。

zouyang920的博客 2746

CentOS 7下kkFileView 4.4.0离线部署全攻略(含LibreOffice 7.5配置避坑指南)

本文详细介绍了在CentOS 7环境下离线部署kkFileView 4.4.0的全流程,包括LibreOffice 7.5的配置避坑指南、中文字体解决方案以及企业级运维实践。通过本指南,用户可以在内网环境中快速搭建稳定可靠的文档在线预览服务,提升办公效率。

weixin_28481133的博客 290

Java基础复习---较为全面

static的作用 static表示静态修饰符,使用static修饰的变量,在Java中分配内存后一直存在,直到程序退出才释放空间。用static修饰的变量可以直接使用类名加“.”的方式访问。 final的作用 final表示不可改变的。如果修饰类,表示该类是一个最终类,不可被继承,默认其中的方法都为final方法。如果修饰方法,不能被子类覆盖,但是能被子类继承(父类中的private方法也...

刘鑫的博客 366

基于深度学习的茶叶等级检测识别系统:YOLOv8 + UI界面 + 数据集完整实现

随着深度学习技术的不断进步,基于计算机视觉的茶叶等级检测系统可以大大提高检测效率,提供客观一致的评估标准。本系统将利用YOLOv8进行茶叶等级的检测与识别,通过图形用户界面(UI)实现与用户的交互,提供茶叶等级分类的实时反馈。本文将详细介绍如何使用YOLOv8结合UI界面,建立一个完整的茶叶等级检测与识别系统,包括数据集的准备、模型的训练、UI的设计及完整的代码实现。本系统的目标是通过深度学习技术,结合YOLOv8模型和图形用户界面(UI),实现对茶叶等级的自动化检测与识别。

YOLO 972

【产品经理修炼之道】- 优惠券系统从入门到精通(一)

为了满足企业的优惠券业务,优惠券系统一般需要包含哪些功能?这篇文章里,作者从架构、功能等维度做了拆解,一起来看看吧。此部分主要讲解为满足公司优惠券业务,需要优惠券系统必须包含哪些功能,即优惠券架构图。

xiaoli8748的专栏 1810

反射和new的区别

我们应该怎么去实现类什么是反射,什么是new两者有什么区别举例说明 什么是反射,什么是new 相信学过C#基础和设计模式的小伙伴都听说过和使用过“实例化”类 这个我们做项目必不可少的过程 那么小伙伴们必不可少的实例化方法一定用过这两种 1.使用配置文件+反射的方法 2.直接new的方法 所以我觉得大家可能也会有相同的疑问:这两个到底有什么区别呢?接下来小编给大家仔细的讲解一下。 两者有什么区别 首先说一下我们最先学到的实例化方法 new(): new对象属于静态编译 也就是说当代码生成EXE文件的时候

金蒂 2259

K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

🔴 K8s(二十二):k8s集群如何部署一个Spring Boot项目(依赖于MySQL和Redis外部服务)

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2万+

java中new和反射的区别

java中new和反射的区别

Jarvan_Song的博客 9605

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java 反射和new的区别

关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细。今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦!1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知...

神韵 686

蓝牙模块HM-10手册

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

java 反射 new区别_java 反射和new的区别

关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细。今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦!1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知...

weixin_31464715的博客 359

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 为什么不new 而用反射_new和java反射的区别

直接用new不行么?为什么要用反射?干嘛弄得那么麻烦!1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知道类名,你怎么反射啊?那么接下来在讲讲new和反射本质上的区别,new属于静态编译,而反射属于动态编译...

weixin_42181686的博客 1097

java 反射和new的区别_反射和new出来的类的区别

关于java 反射和new的区别,在这里我不做多讲,因为网上有大把资料,描述得很详细。今天我只讲一点,为什么要用反射?直接用new不行么?干嘛弄得那么麻烦!1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知...

weixin_42299066的博客 282

dictionary new一个实例_反射和new的区别

什么是反射,什么是new相信学过java基础和设计模式的小伙伴都听说过和使用过“实例化”类这个我们做项目必不可少的过程,那么小伙伴们必不可少的实例化方法一定用过这两种 使用配置文件+反射的方法直接new的方法所以我觉得大家可能也会有相同的疑问:这两个到底有什么区别呢?接下来小编给大家仔细的讲解一下。两者有什么区别首先说一下我们最先学到的实例化方法 new():new对象属于静态编译 也就是说当代码...

weixin_29261711的博客 216

new和java反射的区别

直接用new不行么?为什么要用反射?干嘛弄得那么麻烦!   1.基本上效果差不多,但是new对象,无法调用该类里面私有的东西,反射反之,具体怎么做请参考java AIP,不过反射需要以牺牲性能做代价。   2.在不知道类名的情况下,你怎么去new?我相信很多人看到这句话都迷糊了(新手),肯定有这样的疑问,不知道类名,你怎么反射啊?   那么接下来在讲讲new和反射本质上的区别,new属于静态编译,

平安\平凡\平淡 1493

java反射和new的区别_牛逼哄哄的 Java 反射,看了必懂!

理解反射对学习Java框架有很大的帮助,如Spring框架的核心就是使用Java反射实现的,而且对做一些Java底层的操作会很有帮助。 一、Class类的使用 1、万事万物皆对象,(当然,基本数据类型,静态成员不是面向对象(属于类的)),所以我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象,但是这些对象都不需要new出来,因为java.lang.Cl...

weixin_39620151的博客 533

java反射和new的区别_自学Java第51天:很难弄懂的反射

今天是刘小爱自学Java的第51天。感谢你的观看,谢谢你。话不多说,开始今天的学习:Class对象是用来描述字节码文件(也就是class文件)比如类、接口、枚举……等这些一、Class对象在Java中Class本身也就对应一个类,用来表示class文件,任何一个class文件都是Class类的一个对象1Class对象的三种获取方式①用类名直接调用可以将其理解成类的一个静态属性,所以用类名可以直接调...

weixin_39769740的博客 304

new和newInstance() Constructor.newInstance()区别

1、类的加载方式不同     在执行Class.forName("a.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段。在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。     使用关键字new创建一个类的时候,这个类可以没有被加载,一般也

cws1214的专栏 8489

Java反射机制的原理和用途

转:https://blog.youkuaiyun.com/Appleyk/article/details/77879073 看了好多关于Java反射机制的文章,大多都太过官方,消化起来比较稍显费劲,本篇,我会依据自己的理解去阐述什么是Java的反射机制,反射用在什么地方,以及怎么来使用? 开篇前,我们还是要了解一下,什么是Java的反射机制: “程序运行时,允许改变程序结构或变量类型,...

lin20080410的专栏 4166
上一篇: 二叉搜索树的详解及Map和Set的介绍
下一篇: 【数据结构练习】树和二叉树的选择题精选集锦
WH牛
博客等级 码龄4年 613粉丝 107原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值