反射
Class类:反射的基石;
|--java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class
|--众多的java类用Class来表示;
如何获取类的字节码?
|--用对象调用:p1.getClass();
|--static Class<?> forName(String className)
还有一种方式就是:Class的一个静态方法:Class.forName("java.lang.String");
|--有三种方式可以获取字节码;
一个是类名.class,还有就是对象.getName(),还有一个就是用Class的静态方法:Class.forName("java.lang.String");
反射
|--Filed:字段,就是成员变量,返回来的又是一个类;有相应的类进行接收;
|--把java身上的每一个成分解析成相应的类
Method:它可以代表一个对象,而这个对象就是一个方法,可以得到一个方法,得到的这个方法我们是要用的
|--要得到各个成分所对应的对象,然后用这个对象做一些事情;
一个Constructor,就代表这个类里面的一份字节码;一份构造方法;
|--想要得到所有的构造方法,用getConstructors();
|--想要得到String里面的那个StringBuffer这个参数的构造方法;;用的是String.class.getConstructor(StringBuffer.class);
Method:
|--字节码比较的时候,要用双等号
类加载器
|--就是加载类的工具
|--用到一个类,出现了这个类的名字,这个类的字节码文件,通常是放在指定的classpath目录下,把文件加载进来,再进行出来,处理完的结果就是字节码;把那个.class加载进来,然后对它进行一些处理,-->这个就是类加载器的作用,,用类加载器去加载
|--类加载器有3个默认的类加载器:类加载器本身也是一个java类,把别人加载进来,而这个类加载器是由BootStrap加载的;
这三个类加载器采用具有父子关系的树形结构进行组织;
|--BootStrap:顶级加载器;
|--AppClassLoader
|--AppClassLoader
树状结构的形式:
孙子 爸爸 爷爷(老祖宗)根
AppClassLoader AppClassLoader BootStrap
|--可以自定义类加载器挂在累加器的树上,但是自己写的类加载器的时候,你的类加载器要继承一个ClassLoader这个类,每一个类加载器都应该有个爸爸;
当java虚拟机要加载一个类的时候,到底要派哪个类加载器去加载呢?
|--首先是当前线程的类加载器去加载线程中的第一个类;
|--类加载器的委托机制
|--当第一个类加载了一个类以后,那么第一个类就会去引用第二个类,意思是说:在第一个类里面又调用了第二个类;就是第二个类是由第一个类来加载的,
自定义类加载器的编写:
|--loadClass-->找爸爸-->调用findClass
|--首先我的写的这个类必须要继承一个抽象类ClassLoder
|--模版方法设计模式:就是父类里面有个loadClass
|--要覆盖findClass,原因是要保留loadClass里面的流程,这是findClass这个细节要自己干
代码的概念与作用
|--有个类已经做好了,我们想要给这个类增加一些功能,异常出来,日志功能等等;
|--已经写好了一个类,类里面已经写好了一个方法,现在我想要增加一个功能,就是这个代码运行的时间,
|--前提是我的这个代码是没有给你的,我现在是做代理,我的这个代理里面加上了可以运行的时间,而且我也是实现了你了功能,我就是这个代理,这就是代理作用
面向代理的编程
|--面向方面的编程(AOP)
|--通过采用将切面代码移动到原始方法的周围,这与直接字方法中编写切面代码的运行效果是一样的;-->这个就是代理技术!
动态代理:
|--java虚拟机可以自动生成一份字节码,也就是生成一个类,不要自己写类,这种动态生成的类,就是动态代理类
|--jvm生成的动态类必须要实现一个或者是多个接口
|--如果你的类没有实现一个或者是多个接口,那么可以使用CGLIB库
jvm动态生成的类: