ホームページ  >  記事  >  Java  >  Java はクラス実装のサンプル コードをサイレントにロードします

Java はクラス実装のサンプル コードをサイレントにロードします

黄舟
黄舟オリジナル
2017-10-18 10:23:331670ブラウズ

この記事では、主に Java のクラスのサイレント ロードに関する関連情報をサンプル コードを通じて詳しく紹介します。Java を必要とするすべての人にとって、学習の参考となる価値があります。以下の編集者と一緒に学びましょう。

前書き

この記事は主に Java でのクラスのサイレントロードに関する関連内容を紹介します。この記事を作成した理由は、開発中に時々このようなシナリオがあり、単に Class Basic を取得したいためです。この方法は、以前の記事「JAVA スキャン パッケージ」で使用したものですが、専門的な名前がある場合は修正してください。

通常、クラスをロードするときは、Class.forName(String name) メソッドを使用します。これは、Class オブジェクトを返し、クラス内の静的コード ブロックをトリガーします。次に例を示します。 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, booleanInitialize, ClassLoader loader) を使用することもできます。サイレントローディングの効果を実現します。 🎜🎜🎜🎜概要🎜🎜🎜

以上がJava はクラス実装のサンプル コードをサイレントにロードしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。