2012-12-05 3 views
1

그래서 절대 경로와 함께 .class 파일이 있으며 Java 내부에서 해당 파일 .class을 실행하는 방법을 알아야합니다. 내가 Class 개체를 얻을 수 있다면 좋을 것입니다.외부 .class 파일을 실행 하시겠습니까?

나는 ClassLoaderloadClass 방법을 알고 있지만 파일의 "이진 이름"이 필요합니다. 외부의 .class 파일의 바이너리 이름을 얻는 것이 가능한지 확실하지 않지만, 가능하다면 크게 효과가 있습니다! 그러나 그렇지 않은 경우 외부 .class 파일을 실행하거나 인스턴스를 가져 오는 다른 방법이 있습니까?

/*For those of us who work better with examples.. 
Let's say I have a .class file located at C:/Users/USER/Desktop. So..*/ 

String absolutePath = "C:/Users/USER/Desktop/FILE.class"; 

/*Now, having that, how would I get an instance of that class, or, 
at least, execute it?*/ 
+0

"실행"한다는 것은 무엇을 의미합니까? 당신이 호출하고자하는'main' 메소드가 있습니까? http://stackoverflow.com/questions/738393/how-to-use-urlclassloader-to-load-a-class-file –

+1

을 참조 할 수 있습니다. 1) 기본 패키지에'FILE.class'가 있습니까? '데스크탑 '패키지 또는 다른 것? 2) 반사는 당신이 원하는 것을 성취 할 수있는 방법입니다 (포인트 4를 제외하고). 일반적으로 클래스 경로에 클래스가 있어야합니다 (일반적으로 'URLClassLoader'를 통해). 'our.com.File'. 3) 반사는 때로는 중요하지만 대부분 올바른 사용자 기능에 대한 잘못된 해결책입니다. 이것이 제공 할 사용자 기능은 무엇입니까? 4)'static public void main (String [])'을 가진 클래스는'ProcessBuilder'를 사용하는 별도의'Process'에서 호출 될 수 있습니다. –

답변

4

트릭은 ClassLoader의 defineClass 메소드에 액세스 할 예정입니다. 알려진 인터페이스를 구현 한 무작위 클래스 파일을 동적으로로드하려고한다고 가정 해 봅니다 (인터페이스를 모르는 경우 리플렉션 API를 사용하여 메소드를 찾고 호출합니다).

package com.example.fileclassloader; 

public interface Dynamo { 
    public Integer beDynamic(String s); 
} 

어딘가에는 그 인터페이스를 구현하는 컴파일 된 클래스입니다. 우리는 우리가 defineClass는 방법에 액세스 할 수 있도록하는 클래스 로더를 확장 할 필요가 그것을 사용하는 지금

public class Sample implements com.example.fileclassloader.Dynamo { 

    public Integer beDynamic(String s) { 
    System.out.println(String.format("The value is: %s", s)); 
    return s.length(); 
    } 
} 

: 그것은 뭔가를 보일 수 있습니다. 이 사람은 그냥 파일 이름에 걸릴 바이트를로드하고 인스턴스를 생성합니다 :

package com.example.fileclassloader; 

import java.io.File; 
import java.io.IOException; 
import java.security.SecureClassLoader; 

public class MyDynamoClassLoader extends SecureClassLoader { 

     public Object createObjectFromFile(String fileName) throws 
       InstantiationException, IOException, IllegalAccessException { 

      File file = new File(fileName); 
      byte[] classBytes =  
      org.apache.commons.io.FileUtils.readFileToByteArray(file); 
      Class<?> clazz = defineClass(null, classBytes, 0, classBytes.length); 
      return clazz.newInstance(); 
     } 
} 

이제 우리는 동적으로로드 된 클래스 인스턴스를 사용해야합니다. 우리는 우리가 준수하도록 기대하는 인터페이스로 캐스팅하고 인터페이스의 다른 예처럼 사용

package com.example.fileclassloader; 

import java.io.FileNotFoundException; 
import java.io.IOException; 

public class App { 

    public static void main() throws FileNotFoundException, IOException, 
          InstantiationException, IllegalAccessException { 

     String fname = "target/classes/com/example/fileclassloader/Sample.class"; 

     MyDynamoClassLoader loader = new MyDynamoClassLoader(); 
     Dynamo dynamo = (Dynamo) loader.createObjectFromFile(fname); 
     Integer i = dynamo.beDynamic("Testing"); 

     System.out.println(String.format("Dynamo (%s) returned %d", fname, i)); 

    } 

} 

그리고 좋은 측정을위한, 여기를 구축하기위한 pom.xml 파일은 다음과 같습니다

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example</groupId> 
    <artifactId>fileclassloader</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>commons-io</groupId> 
      <artifactId>commons-io</artifactId> 
      <version>2.4</version> 
     </dependency> 
    </dependencies> 
</project> 
관련 문제