A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 探花 中级黑马   /  2014-4-20 12:22  /  1149 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

最近遇到两个问题,一个是
1.类加载器
2.动态代理
那个高手能给解释一下

6 个回复

倒序浏览
我也正在面对着这两个问题
回复 使用道具 举报
类加载器是将硬盘上class文件加载到内存中的一个机制。
三个主要类加载器是BootTrap,ExtClassLoad,AppClassLoad。
其中,BootTrap是java虚拟机中内核的加载器,而不是java类。
类加载器采用具有父子关系的树形结构进行组织,ExtClassLoad是BootTrap的儿子,AppClassLad是ExtClassLoad的儿子。
每个类加载器都有自己的作用域,BootTrap是JRE/lib/rt.jar
ExtClassLoad是JRE/lib/ext/*.jar
AppClassLoad是ClassPath指定的所有jar或目录
当Java虚拟机要加载一个类时,到底派出哪个类加载器去加载呢?
首先当前线程的类加载器去加载线程中的第一个类。
如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。
还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。
每个类加载器加载类时,又先委托给其上级类加载器。

动态代理是相对于静态代理而言的
动态代理和静态代理的区别
静态代理类由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。
下面是动态代理类的代码,有一些我自己的想法:
  1. package ClassTest;

  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import java.util.ArrayList;
  6. import java.util.List;


  7. public class ProxyHarvest {

  8.         public static void main(String[] args) {
  9.                 /*
  10.                  * 1.动态代理类不可能用到目标类所有的方法,因为目标类本身有自己的特有方法。而动态代理类只能强转成接口的类型,所以有些目标类的方法不能调用到。
  11.                         2.在动态代理类强转成某“一个”接口类型时,只能用到目标类这个接口中所有的方法,而不能用到其他接口中的方法。
  12.                  */
  13.                 String al=new String("1");
  14.                 InvocationHandlerInterface h=new InvocationHandlerInterface(al);
  15.                 CharSequence str=(CharSequence)Proxy.newProxyInstance(al.getClass().getClassLoader(),
  16.                                 al.getClass().getInterfaces(),
  17.                                 h);
  18.                 System.out.println(str);
  19.                
  20.         }

  21. }
  22. class InvocationHandlerInterface implements InvocationHandler{
  23.         private Object obj;
  24.         public InvocationHandlerInterface(Object obj) {
  25.                 this.obj=obj;
  26.         }
  27.         public Object getProxy(){
  28.                 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
  29.         }
  30.         @Override
  31.         public Object invoke(Object proxy, Method method, Object[] args)
  32.                         throws Throwable {
  33.                 System.out.println("jhaha");
  34.                 return method.invoke(obj, args);
  35.         }
  36.        
  37. }
复制代码



回复 使用道具 举报
本帖最后由 の放下执著 于 2014-4-20 21:31 编辑

1、类加载器
     类加载器:专门用于把class类加载进内存中。JVM提供三个类加载器:BootStrap(加载系统目录下的类文件),ExtClassLoader(加载ext目录下的类文件),AppClassLoader(加载classPath目录下的类文件)。   

类加载器中有一个委托机制,如果一个加载器还有父类加载器,那么先尝试用父类加载器加载,当父类加载器加载不了的时候,再委托给子类加载器加载,终止于作为发起者的那个类加载器。如果加载不到,那么抛出ClassNotFoundException.

   自定义一个类加载器:继承自ClassLoader,重写findClass方法。模版设计模式!

2、动态代理
   客户端调用代理,代理的构造方法接收一个InvocationHandler对象;然后客户端调用代理的各个方法时,代理会把各个请求转发给成员变量InvocationHandler,然后InvocationHandler对象又把请求分发给目标的相应方法,并在InvocationHandler的invoke方法中可以增加额外的功能。附:
http://blog.csdn.net/liyuanq/article/details/12268249



回复 使用道具 举报
虽然不懂,但还是来看看!
回复 使用道具 举报
の放下执著 发表于 2014-4-20 21:29
1、类加载器
     类加载器:专门用于把class类加载进内存中。JVM提供三个类加载器:BootStrap(加载系统目 ...

谢谢。很好
回复 使用道具 举报
探花 中级黑马 2014-4-21 21:34:53
7#
清风有意 发表于 2014-4-20 13:18
类加载器是将硬盘上class文件加载到内存中的一个机制。
三个主要类加载器是BootTrap,ExtClassLoad,AppClass ...

谢谢你的分析
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马