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

news/2024/5/18 15:28:51 标签: java, 反射, class, jvm, aop
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

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

这个class="tags" href="/tags/FanShe.html" title=反射>反射其实算是一道初级升中级的面试题,也是初级必须了解,中级必须了解并熟练使用的知识技能。

接下来就开始聊聊吧。

什么是class="tags" href="/tags/FanShe.html" title=反射>反射?

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

说白了,class="tags" href="/tags/FanShe.html" title=反射>反射就是在程序运行时获取和执行某个类属性或方法的功能。

class="tags" href="/tags/FanShe.html" title=反射>反射具体能做些什么?

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

我们默认先写好一个类:APP.class="tags" href="/tags/JAVA.html" title=java>java;

```class="tags" href="/tags/JAVA.html" title=java>java public class APP {

class="has">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,代码如下:

```class="tags" href="/tags/JAVA.html" title=java>java public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {

class="has">Class aClass = Class.forName("com.test.APP");

    APP app = (APP) aClass.newInstance();

}

```

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

调用公共属性(public)

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

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

代码如下:

```class="tags" href="/tags/JAVA.html" title=java>java public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP"); // APP app = (APP) aClass.newInstance();

class="has">Field password = aClass.getField("password");

        //打印结果:public class="tags" href="/tags/JAVA.html" title=java>java.lang.String com.test.APP.password
        System.out.println(password);

        Field[] fields = aClass.getFields();

    }catch (Exception e){
        e.printStackTrace();
    }
}

```

调用私有属性

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

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

代码如下:

```class="tags" href="/tags/JAVA.html" title=java>java public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP");

class="has">Field username = aClass.getDeclaredField("username");
        // 强制获得私有变量的访问权限
        username.setAccessible(true);
        //打印结果:public class="tags" href="/tags/JAVA.html" title=java>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():获取全部公共方法

```class="tags" href="/tags/JAVA.html" title=java>java

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

```class="tags" href="/tags/JAVA.html" title=java>java public static void main(String[] args) { try { Class aClass = Class.forName("com.test.APP");

class="has">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();
    }
}

```

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


http://www.niftyadmin.cn/n/902651.html

相关文章

今天说一下Spring的架构模块!

这是我参与更文挑战的第9天,活动详情查看: 更文挑战 这是一个基础知识篇,看到这篇文章的,希望去多多理解一些更多的底层知识,不要不求甚解,要知其然知己所以然。 spring整体架构 大约分为20个模块,书上大概…

Java基础-异常分类与处理方式

这是我参与更文挑战的第10天,活动详情查看: 更文挑战 异常分类 Error Error 类是指 java 运行时系统的内部错误和资源耗尽错误。应用程序不会抛出该类对象。如果 出现了这样的错误,除了告知用户,剩下的就是尽力使程序安全的终止。…

高频面试题-请聊一下JVM的内存结构!

这是我参与更文挑战的第11天,活动详情查看: 更文挑战 凡是三年以上开发经验的人,都会在简历上写上这么一句话,了解/熟悉JVM(内存结构),对垃圾回收机制有一定的理解。 但是往往大部分人是一问三不知的,或者是…

高频面试题-请聊一下JVM中堆和栈的区别!

这是我参与更文挑战的第12天,活动详情查看: 更文挑战 上一回我们说完了JVM的内存结构,将JVM中有哪些元素已经搞清了,链接在这:高频面试题-请聊一下JVM的内存结构! 今天就再根据之前的主题接着延伸一个更容易…

高频面试题-你知道垃圾回收机制涉及哪些算法吗?

theme: smartblue 这是我参与更文挑战的第13天,活动详情查看: 更文挑战 说到垃圾回收,首先就要先要了解垃圾回收机制涉及到的算法。 如果不了解JVM可以先去看看这几篇文章。 高频面试题-请聊一下JVM的内存结构! 高频面试题-请聊一…

来几道Java面试题,让你不再摸鱼无聊!(一)

theme: smartblue 这是我参与更文挑战的第14天,活动详情查看: 更文挑战 今天我们来整理出一些Java面试题,基本上是面试的时候常问的,有一定的概率会遇到。 1. String和StringBuffer和StringBuild的区别? String类型的值…

来几道Java面试题,让你不再摸鱼无聊!(二)

theme: smartblue 这是我参与更文挑战的第15天,活动详情查看: 更文挑战 今天我们继续来看一些Java面试题,基本上是面试的时候常问的,有一定的概率会遇到,希望大家可以面试顺利。 1. String 类的常用方法都有哪些&#…

来几道Java面试题,让你不再摸鱼无聊!(三)

theme: smartblue 这是我参与更文挑战的第16天,活动详情查看: 更文挑战 1. Spring有几种注入的方式?分别是什么?如何注入? 构造器注入:通过类的构造器方法进行注入。 setter方法注入:通过类的se…