JAVA 基础知识复习
“==”
和 equals()
的区别:
- 基础数据类型使用
"=="
比较的是它们的值 - 引用数据类型使用
"=="
比较的是它们是否是在同一片内存(只有同一个new出来的对象是相等的,否则都是不等的,因为每一次new都会重新开辟新的堆内存 equals()
原始和==
一样,但是大多数库将这个方法复写,复写之后一般是用来比较成员变量的值是否相等
Java 反射 & 类加载
动态反射:
Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法);
- 在运行时调用任意一个对象的方法
反射运用
1 获得Class对象
1 | /** |
2 判断是否是某个类的实例
使用instanceof
判断,也可以接触反射中Class对象的isInstance()
方法来判断是否是某个类的实例
1 | public native boolean isInstance(Object obj) |
3 创建实例
1 | /** |
4 获取方法
1 | import java.lang.reflect.InvocationTargetException; |
5 获取构造器信息
1 | public T newInstance(Object ... initargs) |
6 获取类的成员变量信息
1 | getFiled();//访问公有的成员变量 |
7 调用方法
从类中获取了一个方法后,我们就可以用 invoke() 方法来调用这个方法。
1 | public Object invoke(Object obj, Object... args) throws |
其他
动态代理与静态代理的区别
生成的时间不同,如果需要对多个类进行代理且代理的功能相同,可以使用动态代理生成代理类
类加载
过程
1 | Person person = new Person(); |
双亲委派机制
类的加载首先会调用父类的加载器,只有当父类无法加载的时候,才会用子类的
1 | public abstract class ClassLoader { |