1.Java中什么是反射?
是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
2.Java中如何创建Class对象?
java">
Class class1 = Class . forName ( "xxx.xxx.TestReflection" ) ;
Class class2 = TestReflection . class ;
TestReflection testReflection = new TestReflection ( ) ;
Class class3 = testReflection. getClass ( ) ;
java __18">3.什么是 java 序列化?什么情况下需要序列化?
序列化:将java 对象转换成字节流的过程。
反序列化:将字节流转换成Java对象的过程。
当Java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。
序列化的实现:类实现Serializable接口。
4.动态代理是什么?有哪些应用?
动态代理是指在运行时动态地创建代理类的机制。
在运行时,创建一个新的类,即创建动态代理,可以调用和扩展目标类的方法。动态代理的类是自动生成的。
应用:Spring的AOP,加事务,加权限,加日志
5.怎么实现动态代理?
基于接口的动态代理:代理对象实现了一个或多个接口,通过java .lang.reflect.Proxy类和java .lang.reflect.InvocationHandler接口实现。代理对象的方法调用会被转发给InvocationHandler对象处理
基于类的动态代理:代理对象是目标对象的子类,通过字节码生成库(如CGLIB、Byte Buddy等)动态生成代理类。代理对象继承了目标对象的行为,并可以重写或增加目标对象的方法
6.创建反射对象的方式有哪些?
java">
Class class1 = Class . forName ( "reflection.Student" ) ;
Student student = ( Student ) class1. newInstance ( ) ;
Constructor constructor = class1. getConstructor ( ) ;
Student student1 = ( Student ) constructor. newInstance ( ) ;
7.反射可以获取对象的哪些信息?
反射获取类的构造器:getConstructors();
反射获取类的成员变量:getFileds();
反射获取类的方法:getMethods()。
8.类实例化顺序是什么样的?(会在笔试考打印顺序)
父类静态代码块/静态域->子类静态代码块/静态域 -> 父类非静态代码块 -> 父类构造器 -> 子类非静态代码块 -> 子类构造器
9.Java中创建对象的方式有哪些?
java">
MyClass obj = new MyClass ( ) ;
Class < ? > clazz = MyClass . class ;
Constructor < ? > constructor = clazz. getConstructor ( ) ;
MyClass obj = ( MyClass ) constructor. newInstance ( ) ;
Field field = Unsafe . class . getDeclaredField ( "theUnsafe" ) ;
field. setAccessible ( true ) ;
Unsafe unsafe = ( Unsafe ) field. get ( null ) ;
Class < ? > clazz = MyClass . class ;
MyClass obj = ( MyClass ) unsafe. allocateInstance ( clazz) ;
obj. sayHello ( ) ;
MyClass obj = new MyClass ( ) ;
MyClass cloneObj = ( MyClass ) obj. clone ( ) ;
FileInputStream fileIn = new FileInputStream ( "object.ser" ) ;
ObjectInputStream in = new ObjectInputStream ( fileIn) ;
MyClass obj = ( MyClass ) in. readObject ( ) ;
10.Java中什么是内部类?
在Java中,可以将一个类的定义放在另一个类的内部,这就是内部类。内部类本身就是类的一个属性,与其它属性的定义方式一致。
11.内部类有哪些分类?
- 静态内部类:定义在类内部的静态类,就是静态内部类。静态内部类可以访问外部类所有的静态变量,而不可访问外部类的非静态变量;静态内部类的创建方式:new 外部类.静态内部类()。
- 成员内部类:定义在类内部,成员位置上的非静态类,就是成员内部类。成员内部类可以访问外部类所有的变量和方法,包括静态和非静态,私有和公有。成员内部类依赖于外部类的实例,它的创建方式:外部类实例.new 内部类()。
- 局部内部类:定义在方法中的内部类,就是局部内部类。定义在实例方法中的局部类可以访问外部类的所有变量和方法,定义在静态方法中的局部类只能访问外部类的静态变量和方法。局部内部类的创建方式,在对应方法内:new 内部类()。
- 匿名内部类:匿名内部类就是没有名字的内部类,日常开发中使用的比较多。除了没有名字,匿名内部类还有以下特点: 匿名内部类必须继承一个抽象类或者实现一个接口。 匿名内部类不能定义任何静态成员和静态方法。 当所在的方法的形参需要被匿名内部类使用时,必须声明为 final。 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
12.内部类的优点有哪些?
一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据。
内部类不为同一包的其它类所见,具有很好的封装性。当内部类使用private修饰时,这个类就对外隐藏了。
内部类有效实现了“多重继承”,优化了Java单继承的缺陷。
匿名内部类可以很方便的定义回调。
13.匿名内部类如何访问在其外面定义的变量呢?
外部变量必须是 final 或者实质上是 final 的。这意味着变量要么被声明为 final,要么在匿名内部类中没有被重新赋值。原因是匿名内部类可以访问外部变量的值,但是不能修改外部变量的值。因为匿名内部类实例的生命周期可能超过外部方法的生命周期,所以在匿名内部类中修改外部变量的值可能会导致不可预测的结果