高频面试题-请讲一下Java的反射机制!

简介: 这个反射其实算是一道初级升中级的面试题,也是初级必须了解,中级必须了解并熟练使用的知识技能。

什么是反射?

反射就是在程序运行状态中,对于任何一个类,都能通过特定的方式方法获取到这个类的属性和方法,并且可以对这些属性、方法进行调用。

说白了,反射就是在程序运行时获取和执行某个类属性或方法的功能。

反射具体能做些什么?

能做的事情主要分为以下几种。

我们默认先写好一个类:APP.java;

public class APP {
    private Integer id;
    private String username;
    public String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String toString(){
        System.out.print("toString");
    }
    private String toString_2(){
        System.out.print("toString_2");
    }
}

获取类

Class.forName(param)方法

param:指定类的全路径,比如:com.test.APP,代码如下:

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class aClass = Class.forName("com.test.APP");
        APP app = (APP) aClass.newInstance();
    }

这里的newInstance():实例化Class,生成对象,等同于new。

调用公共属性(public)

getField(param):获取指定的公共属性,param:指定的属性名称。

getFields():获取全部的公共属性,返回值Field[]数组。

代码如下:

    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.test.APP");
//          APP app = (APP) aClass.newInstance();
            Field password = aClass.getField("password");
            //打印结果:public java.lang.String com.test.APP.password
            System.out.println(password);
            Field[] fields = aClass.getFields();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

调用私有属性

getDeclaredField(param):获取指定的私有属性,param:指定的属性名称。

getDeclaredFields():获取全部的私有属性。

代码如下:

    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.test.APP");
            Field username = aClass.getDeclaredField("username");
            // 强制获得私有变量的访问权限
            username.setAccessible(true);
            //打印结果:public java.lang.String com.test.APP.username
            System.out.println(username);
            Field[] fields = aClass.getDeclaredFields();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

这里还涉及到一个方法,就是setAccessible(true),其作用是获得访问权限,否则无法获取这个属性。

调用公共方法 (public)

getMethod(param):获取指定的公共方法,param:指定的方法名称

getMethods():获取全部公共方法

    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.test.APP");
            Method method = aClass.getMethod("toString");
            Method[] methods = aClass.getMethods();
            //执行toString()方法
            Object app = aClass.newInstance();
            method.invoke(app);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

这里还有一个知识点,就是如何执行获取到Method方法,在代码中也有体现,可以自行尝试一下。

调用私有方法

getDeclaredMethod(param):获取指定的私有方法,param:指定的私有方法名称。

getDeclaredMethods():获取全部的私有方法。

    public static void main(String[] args) {
        try {
            Class aClass = Class.forName("com.test.APP");
            Method method = aClass.getDeclaredMethod("toString_2");
            method.setAccessible(true);
            Method[] methods = aClass.getDeclaredMethods();
            //执行toString()方法
            Object app = aClass.newInstance();
            method.invoke(app);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
目录
相关文章
|
5天前
|
算法 Java 调度
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
《面试专题-----经典高频面试题收集四》解锁 Java 面试的关键:深度解析并发编程进阶篇高频经典面试题(第四篇)
15 0
|
4天前
|
缓存 Java 数据库连接
java面试题目 强引用、软引用、弱引用、幻象引用有什么区别?具体使用场景是什么?
【6月更文挑战第28天】在 Java 中,理解和正确使用各种引用类型(强引用、软引用、弱引用、幻象引用)对有效的内存管理和垃圾回收至关重要。下面我们详细解读这些引用类型的区别及其具体使用场景。
15 3
|
4天前
|
消息中间件 Kafka 程序员
Kafka面试必备:深度解析Replica副本的作用与机制
**Kafka的Replica副本是保证数据可靠性的关键机制。每个Partition有Leader和Follower副本,Leader处理读写请求及管理同步,Follower被动同步并准备成为新Leader。从Kafka 2.4开始,Follower在完全同步时也可提供读服务,提升性能。数据一致性通过高水位机制和Leader Epoch机制保证,后者更精确地判断和恢复数据一致性,增强系统容错能力。**
11 1
|
2天前
|
负载均衡 NoSQL 中间件
|
2天前
|
算法 安全 Java
Java小白教学—五千字带你了解多线程机制及线程安全问题
Java小白教学—五千字带你了解多线程机制及线程安全问题
|
2天前
|
Java
解析Java中的反射机制应用
解析Java中的反射机制应用
|
2天前
|
设计模式 缓存 Java
Java中的反射机制:使用场景与注意事项
Java中的反射机制:使用场景与注意事项
|
4天前
|
监控 算法 Java
Java中的垃圾收集机制:原理与实践
在Java的内存管理领域中,垃圾收集(Garbage Collection, GC)扮演着至关重要的角色。本文旨在通过数据导向的分析,科学严谨地阐述垃圾收集的原理、类型及其对性能的影响,并结合逻辑严密的论证,探讨开发者如何有效管理内存以及优化GC策略。文章将引用实验证据和权威统计数据,深入解读垃圾收集器的工作机制,并通过实际案例展示如何调优以提高应用程序的性能。
6 0
|
5天前
|
安全 Java 数据库连接
Java中的反射机制详解:动态类加载与调用
Java中的反射机制详解:动态类加载与调用
|
5天前
|
负载均衡 NoSQL Dubbo
java分布式面试快问快答
java分布式面试快问快答
14 0