我用ASM修改了类,生成了类byte[],最后通过ClassLoader defineClass方法生成了类,请问我怎样将新生成的类,代替Web已经加载的类呢?? 

解决方案 »

  1.   

    首先用不同加载器加载的类是不同的,你不可能用一个新加载的类代覆盖旧类。
    对于这个问题可能的解决方法是手动加载你的新类,比如: Object instance = new YourClassLoader().defineClass(bytes).newInstance();
    Method m = instance.getclass().getmethod("method").
    m.invoke(m, params);只能通过全部的反射来做,应该是你想要的吧。否则会报CAST错的。
      

  2.   

    不是我想要的.我的意思是:例如Tomcat的加载器加载了A.class,而我修改了A.class,产生了个新的class了,请问我该怎样将新的class覆盖原来的呢??新的A.class我是用不同的classLoader产生的.如果用同一加载器产生的可以覆盖的话,请问我有byte[]的类字节数组,怎样用A.class原来的加载器生成class呢?
      

  3.   

    把这个类都用你自定义的同一个classloader 加载 就可以了吧
      

  4.   

    web 加载器 ClassLoader 的defineClass方法是受保护的,怎样将byte[] 转成 class呢??
      

  5.   

    把byte[]写成.class文件,替换原来的类文件。
      

  6.   

    如果要动态替换的话。
    1、替换原来的类加载器
    2、用javaagent
      

  7.   


    怎样替换原来的加载器?
    javaagent咋样用?
      

  8.   

    怎样替换要你自己在Tomcat想办法。
    javaagent是java的启动参数。详细用法见API文档里关于Package java.lang.instrument
      

  9.   

    如果你需要动态加载和覆盖,你应该不断new新的ClassLoader出来,必须用这个新的ClassLoader来定义你的类。这样就可以每次替换了你原始代码看到的是接口或者基类,
      

  10.   

    看来,这问题是解决不了的了,改问一个别的问题!JSP里怎样判断客户端与服务器端是否已断开连接..ASP里有个IsClient....属性..