2013-05-17 3 views
0

스레드를 내 클래스 CustomThread로 강제로 코드를 생성하려고합니다.거기에 새로운 스레드()를 가로 채고 대신 사용자 지정 스레드 instanciate 방법입니다.

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

나는 가 (때문에) findClass (문자열 이름)과로 loadClass (String name) 이름 java.lang.Thread에 잡아 대신 내 CustomThread 클래스를로드 할 수 과부하 내 사용자 정의 클래스 로더에 의해 클래스 로더를 교체했는데, 내가 한 이 CustomClassLoader를 classLoader로 설정하여 내 스레드의 모든 객체를 만듭니다. 이 스레드에서 Instance of String과 다른 Class는 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

누가 새 스레드를 만드는 코드를 "소유"합니까? –

+1

정확히 달성하기를 원하십니까? – hoaz

+0

@JonSkeet 새 Thread() 코드가 Runnable,이 Runnable 및 사용자 정의 클래스로드를 사용하여 생성 된 곳의 스레드의 run 메소드에서 호출됩니다. – essadiel

답변

0

전에로드 된 코드가 인 경우 사용자 지정 코드가 실행될 가능성이 있습니다 (코드가 스레드 인스턴스에서 실행될 확률이 높음).

스레드와 같은 클래스를 대체하려면 사용자 정의 구현으로 jar 파일을 만들고 bootclasspath에 넣어야합니다. 그러나 으로 바꾸려면을 현재 구현으로 바꾸지 않아야하므로 작업이 까다로워집니다.

+0

예, 이것이 제가 생각한 것입니다. 은 다른 옵션을 탐색해야하는 것처럼 보입니다. – essadiel

+0

@essadiel - 실제로 해결하려고하는 문제에 대해 질문하는 것이 더 나을 것입니다. – jtahlborn