黑马程序员_反射2

反射

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动态生成的类:


















发布了40 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/java9832/article/details/46542223