当前位置: 首页 > 知识库问答 >
问题:

有没有办法截取new Thread()并实例化自定义线程

单于旭东
2023-03-14

我试图生成一个代码,强制线程属于我的类CustomThread。

Thread myThread=new Thread(myRunnable);
if(myThread instanceOf CustomThread)
{
    System.err.println("ok");
}

我试图取代ClassLoader我的自定义ClassLoader重载findClass(字符串名称)和loadClass(字符串名称)捕捉名称java.lang.thread和加载我的CustomThread类,而不是,我设置这个CustomClassLoader作为类Loader创建我的线程中的所有对象。

有人知道我想做的事情是否可能,以及如何做吗?

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个答案

陆绍辉
2023-03-14

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

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

 类似资料:
  • 我试图在java中使用Hibernate和TypedQuery。 我试图调用的方法有一个签名 我想像bellow一样调用它,但是用一个真实的实例替换null。 上面的代码经过编译,但显然带有空指针异常。 如果我对擦除的理解是正确的,那么只要我得到类对象的一个实例,这就行了,因为所有泛型类型信息在运行时都会丢失。 是否有任何方法,我可以得到一个类的实例,我可以分配给变量cls,使这个代码将工作?

  • 我目前正在努力实现一种保护隐私的数据挖掘算法。对于不同各方之间的通信部分,我使用的是Netty 4.0。双方之间的通信流如下所示: 其中是启动和控制整个计算的主方。安全多方乘法的逻辑位于 Netty 中。还有另一种用于安全添加的协议。 目前,我使用类似的解决方案,如Netty核心团队的Norman Maurer所示,以了解子协议计算是否已完成。但这感觉有点像是在对抗框架。 是否有办法从< code

  • 问题内容: 我一直在寻找一个问题:从其字符串名称实例化一个类,该字符串名称描述了如何在具有名称时实例化一个类。有没有办法用Java做到这一点?我将拥有包名称和类名称,并且我需要能够创建具有该特定名称的对象。 问题答案: 两种方式: 方法1-仅适用于具有无参数构造函数的类 如果你的类具有无参数构造函数,则可以使用并使用该方法创建一个实例(尽管请注意,此方法通常被认为是有害的,因为它可以击败Java的

  • 不久前,我有了一个关于“参数化”用户定义文本的想法,并且想知道在当前的C标准中是否有任何方法可以做到这一点。 基本上,这个想法是有一个用户定义的文本,其行为可以根据一些参数进行调整。作为一个简单的例子,我选择了一个“定点”字面值,它将浮点数转换为整数;该参数是小数位数的精度。 这只是一个练习,因为我不确定这在实际应用中是否有用。 我的第一个想法是这样的: 但是,它不会编译,因为类范围中不允许使用名

  • 我试图构建一个资源包,从数据库而不是属性文件获取其消息。我做了一些扩展ResourceBundle的测试,ResourceBundle。控件和ListResourceBundle,我想我走的是正确的道路。 当我需要查询实际数据库以从我的ResourceBundle实现中获取消息时,我就到达了一个点。我想利用EJB层上的所有JPA架构体系来运行查询并实例化存储密钥、消息和区域设置的对象。因此,如果我

  • 问题内容: 这个想法是在某些情况下从另一个来源获取数据,所以我有这个存根: 失败了 [$ injector:cdep]找到循环依赖项:拦截器<-$ http 还尝试注入$ injector并使用它获取$ http,结果相同。有任何想法吗? .config就是声明: 问题答案: 注入到: 用它来获取回调函数中返回的对象。 这是一个例子