너무 열심히해야하지 :
- (아래 참조, 하드되지 않음) 자신의 클래스 로더를 작성합니다.
ClassLoader#defineClass(String, byte[], int, int)
을 사용하여 클래스를로드하십시오.
- 인터페이스 (
YourInterface.class.isAssignableFrom(loadedClass);
)가 구현되어 있는지 확인하십시오.
- 1 단계에서 방금 얻은
Class<?>
에서 자바 반영/내성 검사를 사용합니다 (예 : YourInterface obj = (YourInterface)loadedClass.newInstance();
).
- 호출 방법 :
obj.shinyMethod();
자신의 클래스 로더를 만드는 재 : 유망한 소리
class MyClassLoader extends ClassLoader {
public MyClassLoader() {
super(ClassLoader.getSystemClassLoader());
}
// Our custom public function for loading from a byte array,
// this is here just because defineClass is final, so we
// can't just make it public. Name can be anything you want.
public Class<?> loadClassFromByteArray(byte[] data)
throws ClassFormatError {
return this.defineClass(null, data, 0, data.length);
}
}
감사합니다, 다음은 시스템 클래스 로더에 위양하는 간단한 일입니다! 하지만'defineClass'는 보호되어 있습니다. ClassLoader를 서브 클래 싱해야합니까 (조금 두렵습니다)? 아니면 다른 방법이 있습니까? – Zeemee
표준 클래스 로더는 무작위로 물건을 주입하는 사람으로부터 자신을 보호하기 위해 설계되었으므로 안전하지 못한 방법을 언급 했으므로이를 구현하기 위해 고유 한 ClassLoader 구현이 필요합니다 (기존 클래스를 확장 할 수는 있지만). – Romain
@Mulmoth : 필자는 시스템 클래스 로더를 방어하는 클래스 로더를 만드는 방법에 대한 예제를 추가했습니다. –