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

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

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

接下来就开始聊聊吧。

什么是反射?

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

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

反射具体能做些什么?

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

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

```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,代码如下:

```java 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[]数组。

代码如下:

```java 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():获取全部的私有属性。

代码如下:

```java 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():获取全部公共方法

```java

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():获取全部的私有方法。

```java 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();
    }
}

```

今天一个根本没教过我的初中老师竟然加我微信,咨询我这个行业如何,字里行间透露出想走后门给他儿子找工作,一问啥也不会,替他发愁,祝前程似锦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值