当前位置:网站首页>Reflection (II)
Reflection (II)
2022-07-07 07:08:00 【Cold Snowflakes】
Static loading and dynamic loading
Static loading : Load related classes at compile time , If it is not found, an error is reported .
Dynamic loading : Load the required classes at runtime .
Reflection is dynamic loading , Only when it is executed , To load the class .
public class Main{
public static void main(String args[]) throws ClassNotFoundException{
// Static loading , Load when compiling , If you don't find it, you will report an error , Strong dependence
Cat cat = new Cat();
// Dynamic loading , Don't worry about it when compiling , I won't check Whether the loaded class exists
// The code will not be loaded until it is actually run and executed
Class.forName("com.itheima.Cat");
}
}
Class loading
When a program wants to use a class , If the class has not been loaded into memory , Then the system will go through Class loading , Class connection , Class initialization These three steps are used to initialize the class .
In general ,JVM These three steps will be completed in succession , So sometimes these three steps are collectively referred to as class loading .
Class loading :JVM Take bytecode from different data sources (class file ,jar package , Network, etc. ) Convert to binary byte stream to load into memory , And generate Class Instance object .
Class connection
Validation phase : Make sure .class The byte stream of the file contains information that meets the requirements of the current virtual machine , Does not harm the security of virtual machine itself .
Preparation stage : by static Decorated field variables allocate memory and set default initial values , Not included final Embellished static, because final It will be allocated at compile time .
Analytic stage : It mainly replaces the symbolic reference in the constant pool with a direct reference .
Class initialization : Last stage of class loading , Actually start executing what's defined in the class Java Program code , This stage is the implementation of < clinit >() Method process .
< clinit >() Method is created by the compiler in the order in which statements appear in the source file , Automatically collect the assignment actions of all static variables in the class and the statements in the static code block in turn , And merge .
Virtual opportunity guarantees a class of < clinit >() Methods are properly locked in a multithreaded environment , Sync , If multiple threads are initializing a class at the same time , There will only be one thread to execute this class < clinit >() Method , All other threads need to block and wait , Until the active thread executes < clinit >() Methods to complete .
If this class has a superclass , Then initialize it , Perform static initializer and static initialization member variables .
@SuppressWarnings({
"all"})
public class lambdademo {
public static void main(String[] args) {
System.out.println(fun.num);
}
}
/** * stay Linking Of Preparation Stage , Yes num Allocate memory , Initialize to 0 * stay Initialization Stage , collect Static variables , Static code block to <clinit> In the method , And implement <clinit> Method */
class fun {
static{
System.out.println(" Static code blocks are executed ");
num = 300;
}
static int num = 100;
public fun(){
System.out.println(" The constructor is executed ");
}
}
// Output
Static code blocks are executed
100
// The results of the analysis , It is obvious that , What is done in class loading , Of course, we didn't create objects , So the constructor is not called
// The general process should be like this
1. load fun class , And generate a corresponding Class example , And in the method area Bytecode binary data
2. Linking Stage , by num Allocate memory , Initialize to 0
3. Initialization Stage , In the order it appears in the source file , Collect the assignment actions of all static variables and the statements in the static code block in turn , Merge to <clinit> In the method , And implement .
clinit() {
/// Statements in static code blocks /
System.out.println(" Static code blocks are executed ");
num = 300;
/// Static variable assignment statement //
num = 100;
}
Field Some other of the class API
getModifiers(): default/0 , public/1 , private/2 , protected/4 , static/8 , final/16
// have access to Modifier.toString(cls.getModifiers()) Convert a number to a string
getType(): Return to one Class object , Represents the type of the property
getName(): Return property name
Class<fun> funClass = fun.class;
Field[] fields = funClass.getDeclaredFields();
for(Field f : fields){
System.out.println(f.getModifiers()); // The returned value represents its access modifier
System.out.println(f.getType()); // int/double/java.lang.String ...
System.out.println(f.getName()); // Property name
}
Mehod class
getModifiers() // Access modifier
getReturnType() // return Class object , Represents the return type
getName() // Method name
getParameterTypes() // return Class[], Represents an array of parameter types
Create objects by reflection
Class<?> cls = Class.forName("com.itheima.fun");
// 1. Using a parameterless constructor
Object o1 = cls.newInstance();
// 2. Through a parametric constructor ( Specify the parameter list )
Constructor<?> cons1 = cls.getDeclaredConstructor(String.class);
Object o2 = cons1.newInstance("xxx");
// 3. You can also use private Constructor
Constructor<?> cons2 = cls.getDeclaredConstructor(int.class, String.class);
cons2.setAccessible(true);
Object o3 = cons2.newInstance(100, "fang_shou_ba..");
Class Objects are generated as follows :
1、 Class name .class
JVM Class loader will be used , Load classes into memory , Do not do class initialization , return Class The object of .
2、Class.forName(“ The fully qualified name of the class ”)
Load class , And do class initialization ( Will execute static code blocks and initialize static variables ), return Class The object of .
Usually use new When you create an object , The class will be loaded first , After performing Non static code block , Then execute the constructor .
Several generation Class The difference between instance methods
边栏推荐
- From zero to one, I will teach you to build the "clip search by text" search service (2): 5 minutes to realize the prototype
- Unity3d learning notes
- How to model and simulate the target robot [mathematical / control significance]
- Please answer the questions about database data transfer
- 选择商品属性弹框从底部弹出动画效果
- Can 7-day zero foundation prove HCIA? Huawei certification system learning path sharing
- Under what circumstances should we consider sub database and sub table
- The latest trends of data asset management and data security at home and abroad
- 网络基础 —— 报头、封装和解包
- How does an enterprise manage data? Share the experience summary of four aspects of data governance
猜你喜欢
MYSQL----导入导出&视图&索引&执行计划
带你刷(牛客网)C语言百题(第一天)
Take you to brush (niuke.com) C language hundred questions (the first day)
Basic introduction of JWT
Graduation design game mall
基于JS的迷宫小游戏
LC interview question 02.07 Linked list intersection & lc142 Circular linked list II
Anr principle and Practice
.net core 访问不常见的静态文件类型(MIME 类型)
Leetcode t1165: log analysis
随机推荐
2018年江苏省职业院校技能大赛高职组“信息安全管理与评估”赛项任务书第二阶段答案
How to share the same storage among multiple kubernetes clusters
Tool class: object to map hump to underline underline hump
mysql查看bin log 并恢复数据
Please answer the questions about database data transfer
Distributed ID solution
多线程与高并发(9)——AQS其他同步组件(Semaphore、ReentrantReadWriteLock、Exchanger)
freeswitch拨打分机号源代码跟踪
Get the city according to IP
大促过后,销量与流量兼具,是否真的高枕无忧?
【luogu P1971】兔兔与蛋蛋游戏(二分图博弈)
Data of all class a scenic spots in China in 2022 (13604)
【mysqld】Can't create/write to file
Leetcode T1165: 日志分析
Sword finger offer high quality code
Stack and queue-p78-8 [2011 unified examination true question]
2022/07/04学习记录
基于JS的迷宫小游戏
from . onnxruntime_ pybind11_ State Import * noqa ddddocr operation error
Prime partner of Huawei machine test questions