Java进阶之reflection(反射机制)——反射概念与基础

Java进阶之reflection(反射机制)——反射概念与基础这里写链接内容 反射机制是 Java 动态性之一 而说到动态性首先得了解动态语言 那么何为动态语言 一 动态语言动态语言 是指程序在运行时可以改变其结构 新的函数可以引进 已有的函数可以被删除等结构上的变化 比如常见的 JavaScript 就是动态语言 除此之外 Ruby Python 等也属于动态语言 而 C C 则不属于动态语言 二 Java 是动态语言吗 从动态语言能在运行时改变程序结构结构或则变量类型

  反射机制是Java动态性之一,而说到动态性首先得了解动态语言。那么何为动态语言?

一、动态语言


动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C、C++则不属于动态语言。

二、Java是动态语言吗?


三、反射机制:


1.反射机制概念
在Java中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制。

2.反射的应用场合
在Java程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。
编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定
如:






Person p=new Student();

四、Java反射API


五、使用反射的步骤


1.步骤

  • 获取想要操作的类的Class对象
  • 调用Class类中的方法
  • 使用反射API来操作这些信息

2.获取Class对象的方法

  • 调用某个对象的getClass()方法
Person p=new Person(); Class clazz=p.getClass();
  • 调用某个类的class属性来获取该类对应的Class对象
Class clazz=Person.class;
  • 使用Class类中的forName()静态方法; (最安全/性能最好)
Class clazz=Class.forName("类的全路径"); (最常用)

3.获取方法和属性信息

<<<<<<<<<<<<<<<<<<<<< 
       
         public 
        class Person { 
        private String name; 
        private String gender; 
        private 
        int age; 
        public 
        Person() { } 
        public 
        Person(String name, String gender, 
        int age) { 
        this.name = name; 
        this.gender = gender; 
        this.age = age; } 
        //getter和setter方法 
        public String 
        getName() { 
        return name; } 
        public 
        void 
        setName(String name) { 
        this.name = name; } 
        public String 
        getGender() { 
        return gender; } 
        public 
        void 
        setGender(String gender) { 
        this.gender = gender; } 
        public 
        int 
        getAge() { 
        return age; } 
        public 
        void 
        setAge( 
        int age) { 
        this.age = age; } 
        public String 
        toString(){ 
        return 
        "姓名:"+name+ 
        " 性别:"+gender+ 
        " 年龄:"+age; } } 
       
<<<<<<<<<<<<<<< 
       <使用反射<<<<<<<<<<<<<<<<<<< package="" reflection
         ; import java 
        .lang 
        .reflect 
        .Constructor 
        ; import java 
        .lang 
        .reflect 
        .Field 
        ; import java 
        .lang 
        .reflect 
        .Method 
        ; 
        /* * 通过用户输入类的全路径,来获取该类的成员方法和属性 * Declared获取全部不管是私有和公有 * 1.获取访问类的Class对象 * 2.调用Class对象的方法返回访问类的方法和属性信息 */ public class Test { public static void main(String[] args) { try { //获取Person类的Class对象 Class clazz=Class 
        .forName( 
        "reflection.Person") 
        ; //获取Person类的所有方法信息 Method[] method=clazz 
        .getDeclaredMethods() 
        ; for(Method m:method){ System 
        .out 
        .println(m 
        .toString()) 
        ; } //获取Person类的所有成员属性信息 Field[] field=clazz 
        .getDeclaredFields() 
        ; for(Field f:field){ System 
        .out 
        .println(f 
        .toString()) 
        ; } //获取Person类的所有构造方法信息 Constructor[] constructor=clazz 
        .getDeclaredConstructors() 
        ; for(Constructor c:constructor){ System 
        .out 
        .println(c 
        .toString()) 
        ; } } catch (Exception e) { e 
        .printStackTrace() 
        ; } } } 
       

输出结果:

方法信息:
public java.lang.String reflection.Person.toString()
private java.lang.String reflection.Person.getName()
private void reflection.Person.setName(java.lang.String)
public void reflection.Person.setAge(int)
public int reflection.Person.getAge()
public java.lang.String reflection.Person.getGender()
public void reflection.Person.setGender(java.lang.String)
属性信息:
private java.lang.String reflection.Person.name
private java.lang.String reflection.Person.gender
private int reflection.Person.age
构造方法信息
private reflection.Person()
public reflection.Person(java.lang.String,java.lang.String,int)




























4.创建对象

当我们获取到所需类的Class对象后,可以用它来创建对象,创建对象的方法有两种:

  • 使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类有默认的空构造器。
  • 先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建 Class对象对应类的实例,通过这种方法可以选定构造方法创建实例。

示例代码:

package reflection; import java.lang.reflect.Constructor; public class Demo01 { 
         public static void main(String[] args) { try { //获取Person类的Class对象 Class clazz=Class.forName("reflection.Person"); / * 第一种方法创建对象 */ //创建对象 Person p=(Person) clazz.newInstance(); //设置属性 p.setName("张三"); p.setAge(16); p.setGender("男"); System.out.println(p.toString()); / * 第二种方法创建 */ //获取构造方法 Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class); //创建对象并设置属性 Person p1=(Person) c.newInstance("李四","男",20); System.out.println(p1.toString()); } catch (Exception e) { e.printStackTrace(); } } } 

输出结果:

好了,以上是Java反射机制的简单介绍,下一篇文章我将讲一下反射的两个具体应用,通过反射操作注解和通过反射操作泛型,有兴趣的同学可以了解一波。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225255.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午9:44
下一篇 2026年3月17日 上午9:44


相关推荐

  • 接口自动化测试框架Karate入门

    接口自动化测试框架Karate入门介绍在这篇文章中 我们将介绍一下开源的 Web API 自动化测试框架 KarateKarate 是基于另一个 BDD 测试框架 Cucumber 来建立的 并且共用了一些相同的思想 其中之一就是使用 Gherkin 文件 该文件描述了被测试的功能与 Cucumber 不同的是测试用例不需要用 Java 编写 并且被完整的描述在 Gherkin 文件中通过 Karate 您可以编写任何类型的 Web 服务端的测试脚本 并检查响应是否符合预期 Karate 的验证引擎可以灵活的比较两个 JSON 或 XML 文件内容 不受空格和数据顺序的影响

    2026年3月17日
    3
  • 科大讯飞发布星火X1.5深度推理大模型 率先攻克国产算力MoE训练效率难题

    科大讯飞发布星火X1.5深度推理大模型 率先攻克国产算力MoE训练效率难题

    2026年3月14日
    3
  • 保姆级教程:Vagrant 从入门到超神玩法

    保姆级教程:Vagrant 从入门到超神玩法2021 了 不会还有人用虚拟机一步步安装系统吧

    2026年3月26日
    2
  • 小红书用户画像分析_抖音运营之:用户画像的分析方法

    小红书用户画像分析_抖音运营之:用户画像的分析方法不管是从事哪种新媒体,新媒体的核心都是内容,优质的内容才能吸引来用户并留下用户,而用户则是所有运营人员的最终目的,如何服务好用户,如何让用户持续留存下来并保持活性,是每个运营人员的难题,那么如何服务用户呢?想要服务用户首先要了解用户,今天96新媒体就来为大家介绍一下如何通过用户画像来了解用户。一、基础数据用户的基础数据包括用户的一些基本的信息,例如年龄、性别、收入、教育情况等等,这些是最底层的数据…

    2022年5月2日
    100
  • Java8新特性—stream流的使用

    Java8新特性—stream流的使用

    2021年8月3日
    61
  • python和java哪个更值得入手-Python和Java该如何选择?选哪个好?[通俗易懂]

    python和java哪个更值得入手-Python和Java该如何选择?选哪个好?[通俗易懂]在这里为大家介绍一下,其实Python和Java是两种截然不同的编程语言,两者都算是互联网行业中主流的编程语言,不过两者使用起来都是非常好用的,当然要看自己的需求,接下来为大家简单的区分一下Python和Java。Java和Python该如何选择?可以通过以下几个方面来决定:1、从语法结构上来说,Java是面向对象的编程语言,语法结构上面更加严谨一些,不过Java的模块化存在问题。而对比Java来…

    2022年7月8日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号