Java面试题之JavaSE高级

一、Java中的反射

    1.说说你对Java中反射的理解       

            java中的反射首先是能够获取到Java中要反射类的字节码,获取字节码有三种方法。

                        1.Class.forName(className) 

                        2.类名.class

                        3.this.getClass。然后将字节码中的方法,变量,构造函数等映射成相应Method.Filed.Constructor等类

                               这些类提供了丰富的方法可以被我们使用

二、Java中的动态代理

1.动静代理的区别,什么场景使用

            静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类

            静态代理事先知道代理的是什么,而动态代理不需要知道代理什么东西,只有在运行时才知道

            动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是业务类要实现的接口

                ,通过Proxy里的newProxyInstance得到代理对象

        还有一种动态代理,CGLIB代理的类,不需要业务类继承接口,通过派生的子类实现代理,通过在运行时,动态修改,字节码达到修改类的目的

AOP编程就是基于动态代理实现的,比如著名的Spring框架,Hibernate框架等等都是动态代理的使用例子

三、Java中的类加载器

        1、Java中类加载器的种类有哪些

                    1.   根类的加载器(Bootstrap)—-C++写的,看不到源码

                    2.扩展类加载器,(Extension)–加载位置:jre\lib\ext中

                    3.系统(应用)类加载器(System\App) —加载位置:classpath中

                    4.自定义加载器(必须继承ClassLoader)

        2、类什么时候初始化            

                1)创建类的实例,也就是new一个对象

                2)访问某个类或接口的静态变量,或者对该变量赋值

                3)调用类的静态方法

                4)反射

                5)初始化一个类的子类(会首先初始化子类的父类)

                6)JVM启动时标明的启动类,即文件名和类名相同的类

                            只有这六种情况,才会导致类的初始化

        初始化化的步骤

                1)如果这个类还没有被加载和连接,那先进性加载和连接

                2) 加入这个类存在直接父类,并且这个类还没有被初始化,(注意:一个类加载器中,类只能初始化一次)。那就初始化直接的父类(不使用于接口)

            3).加入类中存在的初始化语句(如static变量和static块),那就一次执行初始化语句

           3.Java类加载体系之ClassLoadder双亲委派机制(这个在后面会有专门的文章进行讲解)

4、获得一个对象有哪些方式?

类型.class  例如:String.class

对象.getClass

Class.forName,

    原文作者:年轻诠释我们的梦想_705b
    原文地址: https://www.jianshu.com/p/c83b70ddaee6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞