Java的反射(reflection)机制的简单使用

这篇具有很好参考价值的文章主要介绍了Java的反射(reflection)机制的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、定义

二、用途

三、反射基本信息

四、反射相关的类

五、反射示例

六、反射的优点和缺点


一、定义

        Java的反射机制是运行时的状态,可以通过反射来调用类里面的属性和方法私有的属性和方法也可以调用,也可以对它们进行修改


二、用途

        (1)、在第三方应用开发过程,经常会遇到私有的成员变量和方法或是只对系统应用开放,这式就能用反射机制拿到这些私有的成员变量和方法。

(2)、开发各种通用框架。


三、反射基本信息

        Java程序中许多对象在运行时会两种类型,一种是编译时类型,一种运行时类型,比如:

Person p = new Student();  这种情况下,p在编译时的类型是Person,在运行时是Student,程序在运行时需要知道它的类型和对象,Java的反射程序可以判断该对象和类属于哪一类


四、反射的相关类

Java的反射(reflection)机制的简单使用,1024程序员节,java

(1)、获得类相关的方法

Java的反射(reflection)机制的简单使用,1024程序员节,java

(2)、获得类中属性的方法

Java的反射(reflection)机制的简单使用,1024程序员节,java

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

Java的反射(reflection)机制的简单使用,1024程序员节,java

(4)、获得类中构造器相关方法

Java的反射(reflection)机制的简单使用,1024程序员节,java

(5)、获得类中方法的方法

Java的反射(reflection)机制的简单使用,1024程序员节,java


五、反射的示例

(一)、获得class对象的三种方式,第一种最常用

我们在创建一个包demo1,里面再创建一个Student类,如图

Java的反射(reflection)机制的简单使用,1024程序员节,java

Student类代码:

class Student{
    //私有属性name
    private String name = "bit";
    //公有属性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 sleep");
    }
    private void function(String str) {
        System.out.println(str);
    } @
            Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

代码示例:

public class Test {
    public static void main(String[] args) {
        //获得class对象的三种方式
        //第一种
        try {
            Class.forName("demo1.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //第二种
        Class<?> c2 = Student.class;
        //第三种
        Student student = new Student();
        Class c3 = student.getClass();
    }
}

(二)、反射的使用

(1)、创建对象

                代码示例:
public class Test {
    public static void main(String[] args) {
        //获得class对象的三种方式
        //第一种
        try {
            Class.forName("demo1.Student");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //第二种
        Class<?> c2 = Student.class;
        //第三种
        Student student = new Student();
        Class c3 = student.getClass();
    }
}
        拿到Student类的对象
//第一种
        try {
            Class<?>ClassStudent = Class.forName("demo1.Student");
            Student student = (Student)ClassStudent.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }

(2)、反射私有的构造方法

             代码示例:
    public static void reflectNewInstance() {
        //反射私有的构造方法
        try {
            //先拿到一个类
            Class<?> classStudent = Class.forName("demo1.Student");
            //调用构造方法
            Constructor<?> constructor = classStudent.getDeclaredConstructor(String.class, int.class);
            //私有的属性name需要你确认才能更改
            constructor.setAccessible(true);
            Student student = (Student) constructor.newInstance("xiaoming", 15);
            System.out.println(student);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

调用这个代码后现象:

Java的反射(reflection)机制的简单使用,1024程序员节,java

(3)、反射私有属性

                代码示例:

                

public static void reflectPrivateField() {
        //反射私有属性
        try {
            Class<?> 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);
        }
    }

调用这个代码后现象:

Java的反射(reflection)机制的简单使用,1024程序员节,java

(4)、反射私有方法

                代码示例:
public static void reflectPrivateMethod() {
        //反射私有方法
        try {
            Class<?> classStudent = Class.forName("demo1.Student");
            Method method = classStudent.getDeclaredMethod("function");
            method.setAccessible(true);

            Student student = (Student)classStudent.newInstance();

            method.invoke(student, "我是一个反射参数");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

六、反射的优点和缺点

优点:1、对任意类的成员变量或方法都能调用,对于任意一个对象,都能调用它的方法,封装就不起到作用了。

           2、运用于很多流行的框架(Struts、Hibernate、Spring 等等)。

           3、增强程序的灵活性和扩展性。

缺点:1、效率问题,使用反射程序会导致程序效率低。

           2、因功能太过强大,维护起来也比较麻烦,反射代码相对于普通代码也更复杂。文章来源地址https://www.toymoban.com/news/detail-712955.html


都看到这里了,点个赞再走呗,谢谢谢谢谢!

到了这里,关于Java的反射(reflection)机制的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 程序员帮助程序员!用1024拼出更美好的云计算未来

    中国的云计算市场是全球增长最快的。据预测,中国公共云服务市场的全球份额将从 2020 年的 6.5% 增加到 2024 年的 10.5% 以上。 伴随行业的迅速发展,催生了云计算相关人才需求的井喷增长,供需矛盾凸显。据德意志银行分析报告,越来越多IT企业关闭了线下IDC,开始把业务迁

    2024年02月16日
    浏览(44)
  • C#中的反射(Reflection)使用经典案例

    C#中的反射(Reflection)是.NET框架提供的一种强大的运行时元编程机制,它允许程序在运行时获取类型信息、创建对象实例、调用方法、访问字段和属性等,而这些操作在编译时可能是未知的。以下是几个使用反射的典型场景: 1. 动态加载和调用类的方法 假设有一个库包含多

    2024年02月02日
    浏览(34)
  • Java中反射机制,枚举,Lambda的使用

    目录 一、反射机制 1、含义 2、作用 3、※反射相关的几个类 3.1、Class类(Class对象是反射的基石) 3.2、Class类中相关的方法 3.2.1 (※重要)常用获得类相关的方法 3.2.2 (※重要)常用获得类中属性、变量Field相关的方法  3.2.3 获得类中注解相关的方法  3.2.4(※重要)获得类中构造

    2024年02月11日
    浏览(37)
  • 1024程序员节特辑:【Spring Boot自动配置原理揭秘】

    主页传送门:📀 传送   Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开发过程,其中一个关键的功能就是自动配置(Auto-Configuration)。   自动配置可以根据项目需求自动配置各种服务和组件,它可以帮助开发者

    2024年02月08日
    浏览(54)
  • 解决github ping不通的问题(1024程序员节快乐!

    1024程序员节快乐!( 随便粘贴一个文档,参加活动 域名解析(域名-IP):https://www.ipaddress.com/ Ubuntu平台 github经常ping不通或者访问缓慢,方法是更改hosts文件 在hosts里添加github的ip 140.82.114.4 www.github.com 199.232.5.194 github.global.ssl.fastly.net 54.231.114.219 github-cloud.s3.amazonaws.com 可以访

    2024年01月18日
    浏览(60)
  • 好用且免费的CodeWhisperer,给1024程序员节送礼来了

          国庆期间没有胆量去人从众的景点,关在家里刷手机时意外在亚马逊的User Group公众号上发现了CodeWhisperer这么个好东西(bu yao qian),以后撸代码也可以提高生产力(fang yang mo yu)了,这还不赶紧上手试一下。看官方介绍说它支持流行的IDE开发工具,包括VS Code、Intelli

    2024年02月08日
    浏览(39)
  • unity在使用Reflection Probe(反射探头)bake(烘焙)时,无法反射出范围內的物体。

    bake后发现反射探头还是原来的样子,解决办法以下: 打开lighting设置,观察最下面是否为图中这样   如果是,则点击旁边的cancel即可解决问题。     

    2024年02月12日
    浏览(28)
  • 1024程序员节带你玩转图片Exif信息获取之JavaScript

    目录 一、前言 二、背景 三、Exif.js          1、Exif.js 简介 2、Exif.js 引入 四、多场景展示数据获取 1、原始图片直接获取  2、base64 编码文件加载  3、文件上传的方式加载  五、总结        1024是2的十次方,二进制计数的基本计量单位之一。1G=1024M,而1G与1级谐音,也有一

    2024年02月20日
    浏览(38)
  • 1024程序员节特辑 | Spring Boot实战 之 MongoDB分片或复制集操作

    Spring实战系列文章: Spring实战 | Spring AOP核心秘笈之葵花宝典 Spring实战 | Spring IOC不能说的秘密? 国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题

    2024年02月08日
    浏览(60)
  • 【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(二):核心机制策略

    关于MySQL部分的核心知识进行一网打尽,包括三部分: 基础知识考察、核心机制策略、性能优化策略 ,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第二部分:核心机制策略,子节点表示追问或同级提问 关于MySQL的几种日

    2024年01月22日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包