我尝试生成一个强制线程属于我的类 CustomThread 的代码。
Thread myThread=new Thread(myRunnable);
if(myThread instanceOf CustomThread)
{
System.err.println("ok");
}
我试图用重载 findClass(String name) 和 loadClass(String name) 的自定义 ClassLoader 替换 ClassLoader 以捕获名称 java.lang.thread 并加载我的 CustomThread 类,然后我将此 CustomClassLoader 设置为要创建的类加载器我线程中的所有对象。在此线程中,String 和其他类的实例化由 CustomClassLoader 处理,但新线程(不是)。
有人知道我想做的事情是否可行以及如何做?
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:对不起我的英语不好。