专业的JAVA编程教程与资源

网站首页 > java教程 正文

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

temp10 2025-02-28 17:27:56 java教程 10 ℃ 0 评论

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

接下来就开始聊聊吧。

高频面试题-请讲一下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();
        }
    }

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表