2012-06-29 3 views
2

목표는 업로드 된 파일 .class의 메소드를 실행할 수있는 웹 응용 프로그램을 구현하는 것입니다. 업로드 된 클래스 파일은 byte[]입니다. 이 .class 파일의 공용 클래스는 특정 인터페이스를 구현합니다.
업로드 후 메서드 (인터페이스 구현)를 호출하고 싶습니다.업로드 된 클래스의 메소드를 어떻게 실행할 수 있습니까?

실행중인 Java 응용 프로그램에서 이렇게 할 수 있습니까? 그렇다면 어떻게?

Btw. 보안 위험을 알고 있습니다.

답변

6

너무 열심히해야하지 :

  1. (아래 참조, 하드되지 않음) 자신의 클래스 로더를 작성합니다.
  2. ClassLoader#defineClass(String, byte[], int, int)을 사용하여 클래스를로드하십시오.
  3. 인터페이스 (YourInterface.class.isAssignableFrom(loadedClass);)가 구현되어 있는지 확인하십시오.
  4. 1 단계에서 방금 얻은 Class<?>에서 자바 반영/내성 검사를 사용합니다 (예 : YourInterface obj = (YourInterface)loadedClass.newInstance();).
  5. 호출 방법 : 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); 
    } 
} 
+0

감사합니다, 다음은 시스템 클래스 로더에 위양하는 간단한 일입니다! 하지만'defineClass'는 보호되어 있습니다. ClassLoader를 서브 클래 싱해야합니까 (조금 두렵습니다)? 아니면 다른 방법이 있습니까? – Zeemee

+0

표준 클래스 로더는 무작위로 물건을 주입하는 사람으로부터 자신을 보호하기 위해 설계되었으므로 안전하지 못한 방법을 언급 했으므로이를 구현하기 위해 고유 한 ClassLoader 구현이 필요합니다 (기존 클래스를 확장 할 수는 있지만). – Romain

+2

@Mulmoth : 필자는 시스템 클래스 로더를 방어하는 클래스 로더를 만드는 방법에 대한 예제를 추가했습니다. –

관련 문제