一、类加载
三个步骤:加载、连接、初始化
初始化时机:
-
创建类的实例
-
调用类的类方法
-
访问类或者接口的类变量,或者为该类变量赋值
-
使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
-
初始化某个类的子类
-
直接使用java.exe命令来运行某个主类
二、反射
反射面试题
什么是反射?
反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
哪里用到反射机制?
1.JDBC中,利用反射动态加载了数据库驱动程序。
2.Web服务器中利用反射调用了Sevlet的服务方法。
3.Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
4.很多框架都用到反射机制,注入属性,调用方法,如Spring。
反射机制的优缺点?
优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
缺点:对性能有影响,这类操作总是慢于直接执行java代码。
————————————————
版权声明:本文为CSDN博主「java菜鸟1124」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39565307/article/details/102967762
1、反射概念:
是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。
2、class类对象
class类的理解:博主将它认为为一个中介 就像你向通过镜子看你自己 然后class类就想当为一个实体类想在外也能用 的一个“镜子”;
获取三种方式分类:
-
类名.class属性
-
对象名.getClass()方法
-
Class.forName(全类名)方法
3、反射获取构造方法、获取成员变量以及成员方法
1、
Constructor<?>[] getConstructors() | 返回所有公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor<T> getConstructor(Class<?>... parameterTypes) | 返回单个公共构造方法对象 |
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) | 返回单个构造方法对象 |
Constructor类用于创建对象的方法
方法名 | 说明 |
---|---|
T newInstance(Object...initargs) | 根据指定的构造方法创建对象 |
2、
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
Field类用于给成员变量赋值的方法
私有方法 私有变量都要暴力访问 直接忽略访问检测
voidset(Object obj,Object value) | 给obj对象的成员变量赋值为value |
3、获取成员方法
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>... parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>... parameterTypes) | 返回单个成员方法对象 |
Method类用于执行方法的方法
方法名 | 说明 |
---|---|
Objectinvoke(Object obj,Object... args) | 调用obj对象的成员方法,参数是args,返回值是Object类型 |
⚠️:无论是向获取方法还是获取成员变量都要有一个先获取构造方法实例化一个对象
3.模块化(JDK9才有的哈)
Java以轻量化的方式来运行
exports 报名
requires 模块;
模块服务的基本使用
使用者 uses
提供者 provides 接口名 with