>Java >java지도 시간 >Java는 클래스 구현을 위한 샘플 코드를 자동으로 로드합니다.

Java는 클래스 구현을 위한 샘플 코드를 자동으로 로드합니다.

黄舟
黄舟원래의
2017-10-18 10:23:331676검색

이 글에서는 주로 Java의 클래스 자동 로딩 구현에 대한 관련 정보를 샘플 코드를 통해 자세히 소개합니다. 이 글은 Java를 필요로 하는 모든 사람이 따라할 수 있는 확실한 참고 학습 가치를 가지고 있습니다. 아래 편집자에게 오셔서 함께 배워보세요.

머리말

이 글은 Java에서 Class의 자동 로딩에 대한 관련 내용을 주로 소개합니다. 이 글을 쓰는 이유는 개발 중에 가끔 그런 상황이 발생하고, 단지 Class Basic을 얻고 싶을 때가 있기 때문입니다. 정보가 있지만 관련 정적 코드 블록을 트리거하고 싶지 않습니다. 이 방법은 이전 기사 "JAVA 스캐닝 패키지"에서 사용되었습니다. 전문적인 이름이 있으면 수정해 주세요.

일반적으로 클래스를 로드할 때 Class 객체를 반환하고 클래스에서 정적 코드 블록을 트리거하는 Class.forName(String name) 메서드를 사용합니다. Class.forName(String name)方法,该方法会返回一个Class对象,同时会触发该类中的静态代码块,举个例子:

我们先来编写一个只包含静态代码块的Bean类。


package com.jinggujin.classloader;
public class Bean
{
 static
 {
  System.err.println("static code block.");
 }
}

使用err流是为了让信息及时输出,使用out会有缓存,可能会导致输出信息顺序错乱

然后编写测试方法进行测试。


package test;

import org.junit.Test;

public class ClassLoaderTest
{
 @Test
 public void test() throws Exception
 {
  Class.forName("com.jinggujin.classloader.Bean");
 }
}

运行观察控制台输出:

static code block.

此时控制台会输出我们在静态代码块中打印的内容,这样就证明了了在使用Class.forName(String name)会触发静态代码块,那么,要实现静默加载,我们就不能用这种方式了,我们可以使用ClassLoader的loadClass(String name)方法进行加载,该方法仅会加载类而不会触发静态代码块,同样的编写测试方法进行测试。


package test;
import org.junit.Test;
public class ClassLoaderTest
{
 @Test
 public void test() throws Exception
 {
  Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass("com.jinggujin.classloader.Bean");
  System.err.println(clazz.getName());
 }
}

运行观察控制台输出:

com.jinggujin.classloader.Bean

我们发现,在控制台中仅输出了我们打印的类名信息,而静态代码块没有执行,除此之外,其实我们还可以使用Class.forName(String name)的重写方法forName(String name, boolean initialize, ClassLoader loader)

먼저 정적 코드 블록만 포함하는 Bean 클래스를 작성해 보겠습니다.

rrreee

err 스트림을 사용하는 것은 정보를 제때 출력하기 위한 것입니다. out을 사용하면 캐싱이 발생하여 출력 정보가 ​​순서대로 되지 않을 수 있습니다

🎜🎜그런 다음 테스트 방법을 작성하세요. 테스트. 🎜

🎜🎜rrreee🎜실행하고 콘솔 출력을 관찰하세요: 🎜🎜🎜정적 코드 블록.🎜🎜이때, 콘솔은 우리가 정적 코드 블록에 인쇄한 내용을 출력할 것입니다. Class.forName(String name)을 사용하면 정적 코드 블록이 트리거되고 자동 로딩을 달성하기 위해 ClassLoader의 loadClass(String name) 를 사용할 수 없습니다. > 로드할 메서드입니다. 이 메서드는 정적 코드 블록을 트리거하지 않고 클래스만 로드합니다. 테스트를 위해 동일한 테스트 메서드를 작성합니다. 🎜

🎜🎜rrreee🎜실행하고 콘솔 출력을 관찰하세요. 🎜🎜rrreee🎜우리가 인쇄한 클래스 이름 정보만 콘솔에 출력되고 정적 코드 블록은 실행되지 않았으며, 기타 그보다 사실 Class.forName(String name)forName(String name, boolean 초기화, ClassLoader loader) 재작성 메소드를 사용할 수도 있습니다. 자동 로딩 효과를 얻으세요. 🎜🎜🎜🎜요약🎜🎜🎜

위 내용은 Java는 클래스 구현을 위한 샘플 코드를 자동으로 로드합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.