类加载和反射
1、JDK动态代理和AOP(面向切面编程)
关于JDK的动态代理,最为人熟知的是Spring AOP的实现,默认情况下,Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对类的代理使用CGLIB来实现。
JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。JDK从1.3开始支持动态代理。
博客:https://blog.csdn.net/tyrroo/article/details/79072796
https://blog.csdn.net/jiankunking/article/details/52143504
https://www.jianshu.com/p/3616c70cb37b
2、类加载机制
类的加载由类加载器完成,类加载器通过用JVM提供。
两次运行Java程序处于两个不同的jvm进程中,两个jvm之间不会共享数据。
如:
public class A
{
public static int a = 6;
}
/*public class A1
{
public static void main(String[] args)
{
A a = new A();
a.a++; // 7
}
}
public class A2
{
public static void main(String[] args) {
A b=new A();
b.a; //6
}
}
*/
类的加载:将类的class文件读入内存中,并创建一个java.lang.Class对象。
程序使用某个类是会通过加载、链接、初始化3个步骤对该类进行初始化。
Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
类加载器:负责将.class文件(在磁盘或者网络上)加载到内存中,并生成对应的Java.lang.class对象。一旦同一个类被加载就不会再次载入了。
博客:https://www.cnblogs.com/xdouby/p/5829423.html
3、反射
生成并操作对象,运行时发现和使用类的信息。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
其实就是动态的从内存加载一个指定的类,并获取该类中的所有的内容。
Java对象类型:编译时的类型和运行时的类型。
Person p=new Student();p变量编译类型为Person,运行类型为Student。
Class 类与 java.lang.reflect 类库一起对反射的概念进行了支持,该类库包含了 Field,Method,Constructor 类 (每个类都实现了 Member 接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。
博客:https://blog.csdn.net/sinat_38259539/article/details/71799078
https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html
https://www.cnblogs.com/luoxn28/p/5686794.html
https://www.cnblogs.com/tech-bird/p/3525336.html
Spring中的IoC(控制反转)的实现原理就是工厂模式加反射机制。
https://www.cnblogs.com/Eason-S/p/5851078.html