스레드를 내 클래스 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 : 가난한 영어에 대한 죄송합니다.
누가 새 스레드를 만드는 코드를 "소유"합니까? –
정확히 달성하기를 원하십니까? – hoaz
@JonSkeet 새 Thread() 코드가 Runnable,이 Runnable 및 사용자 정의 클래스로드를 사용하여 생성 된 곳의 스레드의 run 메소드에서 호출됩니다. – essadiel