0

我尝试生成一个强制线程属于我的类 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:对不起我的英语不好。

4

1 回答 1

0

我想在您的任何自定义代码有机会执行之前加载 Thread 类(因为您的代码很可能在 Thread 的实例上执行)。

为了替换像 Thread 这样的类,您很可能需要使用您的自定义实现创建一个 jar 并将其放在 bootclasspath 中。但是,您需要替换当前的实现而不是扩展它,这使事情变得更加棘手。

于 2013-05-17T15:42:25.337 回答