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,