ClassLoader:它是用来加载Class文件到JVM中,只有这样程序才能运行,因为java程序是要在虚拟机中运行的。这个动态加载的机制就是通过这个ClassLoader来实现。

动态代理:隐藏被代理对象,使被代理对象不让外界直接访问。

      在外界开来,代理对象就是被代理对象,二者就像是一个对象一样。当我们调用被代理对象完成某个功能时,代理对象会帮助我们找到真正的被代理对象来完成这个功能。

代理的原则:1.代理对象和被代理对象一定要实现同一个接口。2.代理对象一定要明确被代理对象。3.代理对象其实就是对被代理对象的拦截,重新实现一些功能,对于不需要被改变的方法,直接调用被代理对象的方法就可以了。

代理的步骤:1.持有被代理对象(为了更通用,所以对接口进行代理)2.实现同样的接口3.通用类不需要实现接口了。

使用动态代理:如:Dao dao=new EmpDaoProxy(new EmpDao());

动态代理与静态代理的思想是完全不一样的,静态代理(装饰模式实现的就是一种静态代理)是增强,动态代理是拦截(springAOP机制)

静态代理的弊端:如果接口的方法很多时,代码量将会非常繁琐。比如装饰request时,幸亏有了实现好的通用类。直接继承就搞定。

虚拟机为我们提供了一种机制,动态的生成一个类(Class对象),因为虚拟机不知道这个代理类(实现被代理对象和代理对象相同的接口)要实现的方法,所以要求我们提供这个代理类需要实现的所有接口。

被代理对象怎么加载,我代理对象也怎么加载,因为他们实现的是同一个接口,所以加载的方式一定相同,这就要用同一个加载器。因为代理对象要实现被代理对象所实现的接口,所以我们也要传入被代理对象实现的所有接口。    

动态生成的代理不知道要做什么事情。但是只要将被代理对象、被代理对象的方法以及这个方法所需要的参数都交给代理对象。那么代理对象就知道自己要做什么事情了。比如当我调用被代理对象的delete方法时需要做权限检查,那么代理对象就会调用自身的invoke方法去做这些事情。

静态代理和动态代理实现的效果是一模一样的,都是把源对象(被代理对象)隐藏了起来,然后可以通过代理对象调用处理后的方法,也可以通过代理对象调用被代理对象的方法,还可以调用与被代理对象无关的方法。

说白了,我们不用工具类proxy也可以做代理,即静态代理,但是使用了动态代理将大大的简化了我们的代码量。所以要使用动态代理。

Java代码分三个阶段:

Sourcezp.java这并不是java代码,这实际就是一个文本文件,是windows操作系统识别的文件,只不过是按照java语法书写的文本文件。当书写完之后就交给编译器检查,当编译器发现你书写的文本文件符合java规则,这时编译就把你的文件编译成ZP.class,这时这个ZP.class才叫真正意义上的java代码。我们平常所说的代码,把代码给我,其实就是把你的class代码给我。因为class代码是一种字节码,所以通常我们叫java代码为字节码,java代码就是字节型的代码。Java代码是不能被执行的,字节码文件也是windows操作系统识别的文件,java虚拟机不能直接运行这个文件,这时就需要加载器对java代码进行类加载,把这段代码加载进虚拟机分配的内存。当java代码加载进虚拟机内存后java代码就被放进了堆内存(栈内存不谈),就变成了java对象。这个java对象实际就是Class对象。

Classjava类就是一个Class类型的对象,所以代码变成类的过程就被称为类加载。类加载器就是java代码的解析器,用来将java代码解析成java对象,就像xml的解析器是dom4j中的解析器一样。通常我们说的类,都是一种数据类型,然后类的类型就是Class类型,而类就是Class对象。由此可知,类也是一种数据。

Runtime:通过Class对象实例化数据对象。这样这个对象就可以调用方法等等,java程序就跑起来了。

反射:jdk提供的一种机制,解析一个类的各个组成部分。这个各个组成部分就是这个类的数据成员,由此可知,类本身就是一种数据。反射就是解刨Class对象的。

Class:New Instance()默认调用无参的构造方法

ConstructorgetParameterTypes()获得构造函数的参数列表

反射的第一步:获得一个Class类型的对象(Class对象)《有三种方式,因为一段代码处于三种状态》source阶段,要进行类加载。Class阶段,***.class .Runtime阶段,只是说明了在不同的阶段获得Class对象,即获得Class对象的时间问题。 

再深入理解反射:有一个人叫科比,这是一个人,它是进不了程序的,这时我们就要把它封装到对象里,用一个对象来表示科比这个人,那么对象一定是要有类型的。还有,比如“abc”,这是一个字符串,这个字符串是进不了程序的,这时也要用对象来表示“abc”,这个对象的类型就是String类型的。还有,比如我的硬盘里有一段代码叫zp.class,这是一个windows系统下真实存在的文件,那么真实存在的东西是进不了虚拟机的虚拟内存的,这时我们就要用对象(Class对象)来表示它,但是这个对象就是Class类型的,最终这个对象会被实例化为ZP对象。数据对象的形成轨迹是先Class对象----Person对象(举例)。因为程序跑起来是需要java(Class对象)所表示的数据的。如成员,方法等。

一个类在内存中只会存在一个,即Class对象只会是一个,因为类加载器只会对java代码加载一次,也就是一段代码在内存中只对应一个对象。

最后,Java类就是Class对象,即类也是对象。