我尝试生成一个代码,强制该线程属于我的类CustomThread。
Thread myThread=new Thread(myRunnable);
if(myThread instanceOf CustomThread)
{
System.err.println("ok");
}
我试图通过我的自定义ClassLoader替换ClassLoader findClass(String name)和loadClass(String name)来捕获名称java.lang.thread并加载我的CustomThread类,并将此CustomClassLoader设置为classLoader以创建我的线程中的所有对象。在这个线程中,String和其他类的实例由CustomClassLoader处理但是新的Thread(不是)。
有人知道我想做什么是可能的,怎么做?
public Class<?> loadClass( String name ) throws ClassNotFoundException
{
System.err.println( "loadClass name: "+name );
if ( name.equals( Thread.class.getName() ) && flagThreadDefine == 0 )
{
// Class<?> redifineClass = redefineClass( name );
flagThreadDefine = 1;
return redefineClass(CustomThread.class.getName() );
}
flagThreadDefine = 0;
return super.loadClass( name );
}
private Class<?> redefineClass( String name )
{
URL findResource = findResource( name.replace( '.', '/' ).concat( ".class" ) );
if ( findResource != null )
{
try
{
URLConnection openConnection = findResource.openConnection();
InputStream input = openConnection.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int data = input.read();
while ( data != -1 )
{
buffer.write( data );
data = input.read();
}
input.close();
byte[] classData = buffer.toByteArray();
return defineClass( name, classData, 0, classData.length );
}
catch ( IOException ex )
{
Logger.getLogger( CustomClassLoader.class.getName() ).log( Level.SEVERE,null, ex );
}
}
return null;
}
ps:抱歉我的英语不好。
答案 0 :(得分:0)
我认为Thread类在之前加载你的任何自定义代码都有机会执行(因为你的代码最有可能在一个Thread的实例上执行)。
为了替换像Thread这样的类,您很可能需要使用自定义实现创建一个jar并将其放在bootclasspath上。但是,你需要替换当前的实现而不是扩展它,这会让事情变得更加棘手。