사용자 정의 클래스 로 더 를 통 해 동적 컴 파일 과 동적 구현 인터페이스
1. java. lang. Class. forName (fullClassName) 을 사용 합 니 다.
2. 사용자 정의 클래스 로 더 를 사용 합 니 다.
자바 류 로 딩 을 사용자 정의 로 불 러 오 는 방법 을 보 여 줍 니 다.
기본적으로 사용 하 는 클래스 로 더 를 통 해 클래스 를 불 러 옵 니 다. 일반적으로 다음 과 같은 방법 을 사용 합 니 다.
- Class obj = aLoader.loadClass(customFullClassName, true);
loadclass 방법의 실현 을 보십시오.
- protected synchronized Class<?> loadClass(String name, boolean resolve)
- throws ClassNotFoundException
- {
- Class c = findLoadedClass(name);
- ……………
- ………
- }
이것 은 부모 위임 체 제 를 이용 한 실현 이다. 가장 중요 한 것 은 find Loaded Class 방법 이 고 다른 것 은 아버 지 를 찾 는 것 이다.
그래서 사용자 정의 확장 을 하려 면 이 방법 부터 시작 해 야 합 니 다.
findLoadClass 의 기본 값 은 다음 과 같 습 니 다.
여기 서 우 리 는 가장 흥미 로 운 방법 을 보 았 다. define Class
protected final Class defineClass(String name, byte[] b, int off, int len);
이 방법 은 바이트 데 이 터 를 Class 로 변환 하고 초기 화 합 니 다.
물론 바 꿀 수 없다 면 이상: ClassFormatterror.
그래서 우 리 는 파일 시스템 에서 임의의 합 법 적 인 파일 을 자 유 롭 게 불 러 올 생각 을 하 게 되 었 다.
클래스 계승 ClassLoader - 파일 시스템 의 *. class 파일 을 byte [] 방식 으로 전송 - defineClass 처리 에 맡 깁 니 다. 이러한 방법 은 자바 의 부모 위임 을 파괴 한 것 같 습 니 다.
그래서 클래스 정 의 는 다음 과 같다.
- /**
- * .
- * @author nileader
- */
- public class CustomClassLoader extends ClassLoader {
-
- public static final String classPath = System.getProperty("user.dir") + "\\bin\\";
-
- /**
- * , Java
- * @param classFullName
- * @return
- */
- protected Class customLoadClass(String classFullName){
- String filePath = classFullName2FileName(classFullName, classPath);
- byte[] data = loadClassFromFS(filePath );
- // defineClass .
- return defineClass(classFullName, data, 0, data.length);
- }
-
- /**
- * , byte[].
- * @param name
- * @return
- */
- private byte[] loadClassFromFS(String filePath) {
- FileInputStream fis = null;
- byte[] byteSource = null;
- try {
- fis = new FileInputStream(new File(filePath ) );
- ByteArrayOutputStream tempSource = new ByteArrayOutputStream();
- int readChar= 0;
- while ((readChar = fis.read()) != -1) {
- tempSource.write(readChar );
- }
- byteSource = tempSource.toByteArray();
- } catch (IOException e) {
- //IO
- }
- return byteSource;
- }
-
- /**
- * classpath .
- * @param classFullName
- * @param classPath
- * @return
- */
- public String classFullName2FileName(String classFullName, String classPath){
- classFullName = classFullName.replaceAll("[.]", "\\\\" );
- return classPath + classFullName + ".class";
- }
이제 수 정 된 클래스 로 더 를 사용 하여 클래스 로 딩 할 수 있 습 니 다.
- CustomClassLoader customClassLoader = new CustomClassLoader();
-
- Class obj = customClassLoader.customLoadClass("com.test.DemoInterface" );
불 러 온 후에 Class, Field, Method 의 일부 방법 으로 인터페이스의 '실현' 을 할 수 있 습 니 다.
방법 이 많다.
여기 서 이른바 '실현' 이란 프로그램 운영 과정 에서 의 수요 에 따라 구체 적 인 방법 으로 쓰 는 것 이다. 예 를 들 어:
동적 컴 파일
동적 컴 파일 과정 은:
임시 *. 자바 파일 을 만 들 고 com. sun. tools. javac. Main 을 사용 하여 명령 행 의 자바 파일 컴 파일 을 모 의 합 니 다.
- /**
- * Java .
- *
- * @param sourceCode
- * Java
- * @throws Exception
- */
- public static boolean compile(String sourceCode, String className) {
- File file = null;
- // *.java .
- try {
- file = File.createTempFile("JavaRuntime", ".java", new File(
- targetPath));
- } catch (IOException e) {
- // IO
- }
- String fileName = null;
- if (null != file) {
- //
- fileName = file.getName();
- file.deleteOnExit();
- }
-
- // java .
- PrintWriter out = null;
- try {
- out = new PrintWriter(new FileOutputStream(file));
- } catch (FileNotFoundException e) {
- // FileNotFoundException .
- }
- if (null != out) {
- out.write(sourceCode);
- out.flush();
- out.close();
- }
-
- /** */
- if (fileName != null) {
- Main.compile(new String[] { "-d",
- System.getProperty("user.dir") + "\\bin\\",
- targetPath + fileName });
- }
-
- return true;
-
- }
생 성 된 후에 같은 방식 으로 클래스 의 로드 를 실현 할 수 있 습 니 다. 다음 과 같은 방식 으로 진행 할 수 있 습 니 다.
- Class c1 = customClassLoader.customLoadClass(implementsFullName);
- Constructor con = c1.getDeclaredConstructor();
- con.setAccessible(true );
- Object o = con.newInstance();
- // bean
- Method method = c1.getMethod("print");
- method.setAccessible(true);
- method.invoke(o);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.