什么是java反射

简介: 什么是java反射

前言:最近一直在学习,什么是java反射,今天就好好的聊一聊,到底什么是java反射???


一:什么是反射

谈到java反射,我们不妨先去运用一下我们之前的知识,什么是反射。大家可能见到最多的就是镜子了,人照镜子,通过镜子的反射看到自己。或者某个我们看不到的位置,通过把镜子伸进去,通过镜子的反射,看到对应的物品。

我理解,反射就是一面镜子,让我们可以看到我们不应该看到的。


二:java反射概念

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

java反射允许,在运行中操作,类所具有成员变量和方法。(通过反射private修饰的属性、方法、都可以调用)

也就是说,java反射允许我们,在程序运行的时候,可以通过反射拿到类的所有资源。


三:java反射的具体使用

3.1:访问构造函数

import java.lang.reflect.Constructor;
//用来演示构造函数的使用
public class CreateObject {
    public void useConstructor() {
        try {
            //获取Student的字节流对象
            Class studentClass = Class.forName("Student");
            System.out.println("开始调用Student无参构造函数");
            //---------------构造函数的访问------------------
            //创建对象,无参构造函数
            Object obj = studentClass.newInstance();
            //转化成我们要使用的对象
            Student student2 = (Student) obj;
            student2.study();
            System.out.println("结束调用Student无参构造函数");
            System.out.println("开始调用Student公有带参构造函数");
            //反射的getConstructor方法的使用,公有带参构造函数
            Constructor<?> constructor = studentClass.getConstructor(int.class, String.class);
            Object obj2 = constructor.newInstance(12, "23");
            Student stu2 = (Student) obj2;
            stu2.study();
            System.out.println("结束调用Student公有带参构造函数");
            System.out.println("开始调用Student私有带参构造函数");
            //getDeclaredConstructor方法的使用,私有带参构造函数
            Constructor<?> constructor2 = studentClass.getDeclaredConstructor(int.class);
            //设置私有构造函数可访问
            constructor2.setAccessible(true);
            Object obj3 = constructor2.newInstance(12);
            Student stu3 = (Student) obj3;
            stu3.study();
            System.out.println("结束调用Student私有带参构造函数");
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

3.2 访问方法

import java.lang.reflect.Field;
import java.lang.reflect.Method;
//用来演示方法的使用
public class UseMethod {
    public void useMethod(){
        try {
            //获取Student的字节流对象
            Class<Student> stuClass = (Class<Student>) Class.forName("Student");
            //公有方法,且不传参
            Student student = stuClass.newInstance();
            Method study = stuClass.getMethod("study");
            //调用公有学习方法
            System.out.println("调用了公有的study方法");
            study.invoke(student);
            //私有方法
            Student student2 = stuClass.newInstance();
            Method sayHi = stuClass.getDeclaredMethod("sayHi",String.class);
            sayHi.setAccessible(true);
            System.out.println("调用了私有的sayHi方法");
            //通过invoke调用sayHi
            sayHi.invoke(student2, "Tony");
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

3.3:访问属性

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
//用来演示属性的使用
public class UseAttribute {
    public void useAttribute() {
        try {
            //获取Student的字节流对象
            Class<Student> stuClass = (Class<Student>) Class.forName("Student");
            //公有属性
             Student student = stuClass.newInstance();
             Field score = stuClass.getField("score");
             score.set(student, 12);
           //私有属性
            Student student2 = stuClass.newInstance();
            Field age = stuClass.getDeclaredField("age");
            age.setAccessible(true);
            age.set(student2, 12);
            //获取所有属性
            for (Field field : stuClass.getFields()) {
                System.out.println(field);
            }
            System.out.println("---分割线---");
            for (Field declaredField : stuClass.getDeclaredFields()) {
                System.out.println(declaredField);
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

3.4:客户端

public class Client {
    //程序入口
    public static void main(String[] args) {
        //调用三种类型的构造函数
        CreateObject createObject1 = new CreateObject();
        createObject1.useConstructor();
        //调用两种不同类型的方法
       UseMethod useMethod1 = new UseMethod();
       useMethod1.useMethod();
        //调用两种不同的属性
        UseAttribute useAttribute1 = new UseAttribute();
        useAttribute1.useAttribute();
    }
}
目录
相关文章
|
26天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
17 0
[Java]反射
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
65 9
Java——反射&枚举
|
1月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
26 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
16 0
|
2月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
2月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
2月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)
|
4月前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
35 5
|
3月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
30 0