日期:2014-05-20  浏览次数:20598 次

怎么让我从Java API继承的类实例化时调用的是自己写的ClassLoader
比如我现在有一个类:DemoThread extends Thread 
现在我改变DemoThread的默认类加载器sun.misc.Launcher$AppClassLoader@18d107f,让它变成我自己定义的MyClassLoader extends ClassLoader。不知道应该怎么做? 
注意这是一个自动性的行为。
Class.forName(String name,boolean flag,ClassLoader loader)这个是行。但是每一次都要自己这样写一次,太麻烦,
有没有简单一点的,像这样:DemoThread thread = new DemoThread()会自动调用到我自己的加载器MyClassLoader。?

------解决方案--------------------
不晓得,帮你定个
------解决方案--------------------
没几个类是可以的 你这个不可以

下面的可以
javax.rmi.CORBA 
org.omg.CORBA 
org.omg.CORBA.DynAnyPackage
org.omg.CORBA.ORBPackage
org.omg.CORBA.portable
org.omg.CORBA.TypeCodePackage
org.omg.CORBA_2_3 
org.omg.CORBA_2_3.portable
org.omg.CosNaming 
org.omg.CosNaming.NamingContextExtPackage
org.omg.CosNaming.NamingContextPackage
org.omg.Dynamic
org.omg.DynamicAny
org.omg.DynamicAny.DynAnyFactoryPackage
org.omg.DynamicAny.DynAnyPackage
org.omg.IOP
org.omg.IOP.CodecFactoryPackage
org.omg.IOP.CodecPackage
org.omg.Messaging
org.omg.PortableInterceptor
org.omg.PortableInterceptor.ORBInitInfoPackage
org.omg.PortableServer
org.omg.PortableServer.CurrentPackage
org.omg.PortableServer.POAManagerPackage
org.omg.PortableServer.POAPackage
org.omg.PortableServer.portable
org.omg.PortableServer.ServantLocatorPackage
org.omg.SendingContext
org.omg.stub.java.rmi 
org.w3c.dom
org.xml.sax
org.xml.sax.ext
org.xml.sax.helpers


------解决方案--------------------
使用java.lang.instrument实现一个java agent,然后运行时加参数-javaagent,用这种方式应该做到
就相当于aspectj的LTW
------解决方案--------------------
你用一个ClassLoader加载一个类以后,这个类所引用的类全部都由这个ClassLoader加载(也可能由它的父ClassLoader加载),这个你可以去查看ClassLoader的工作原理。

还有,ClassLoader是负责把类加载到虚拟机,但是实例化对象跟类加载没有什么关系。

最后,利用ClassLoader加载类到虚拟机,请不要用反射中的forName()方法来加载类,而应该是使用你实现的ClassLoader内的 loadClass()方法来加载类。

最后,我想要问你,你为什么要自己实现类加载器?难道java虚拟机默认所提供的类加载不能够满足你的要求么?很显然你对类加载器的工作原理与适用范围不是很理解,或许你想要学习类加载器,你首先要理解它能干什么才行。