트릭은 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>
"실행"한다는 것은 무엇을 의미합니까? 당신이 호출하고자하는'main' 메소드가 있습니까? http://stackoverflow.com/questions/738393/how-to-use-urlclassloader-to-load-a-class-file –
을 참조 할 수 있습니다. 1) 기본 패키지에'FILE.class'가 있습니까? '데스크탑 '패키지 또는 다른 것? 2) 반사는 당신이 원하는 것을 성취 할 수있는 방법입니다 (포인트 4를 제외하고). 일반적으로 클래스 경로에 클래스가 있어야합니다 (일반적으로 'URLClassLoader'를 통해). 'our.com.File'. 3) 반사는 때로는 중요하지만 대부분 올바른 사용자 기능에 대한 잘못된 해결책입니다. 이것이 제공 할 사용자 기능은 무엇입니까? 4)'static public void main (String [])'을 가진 클래스는'ProcessBuilder'를 사용하는 별도의'Process'에서 호출 될 수 있습니다. –