有没有办法拦截新的Thread()并实例化自定义线程

时间:2013-05-17 15:29:26

标签: java intercept

我尝试生成一个代码,强制该线程属于我的类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:抱歉我的英语不好。

1 个答案:

答案 0 :(得分:0)

我认为Thread类在之前加载你的任何自定义代码都有机会执行(因为你的代码最有可能在一个Thread的实例上执行)。

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