ホームページ  >  記事  >  Java  >  Java で endorsed を使用して、jdk によって提供されるクラスのインスタンスをオーバーライドする方法

Java で endorsed を使用して、jdk によって提供されるクラスのインスタンスをオーバーライドする方法

黄舟
黄舟オリジナル
2017-09-05 10:06:191947ブラウズ

この記事では、JDK が提供するクラスをカバーするために Java がどのように使用されるかについての関連情報を主に紹介します。この記事では、コード例を通じて、それを必要とするすべての人の学習に役立つ特定の学習価値があります。フォロー 編集者と一緒に学びましょう。

まえがき

以前、Tomcat catalina.bat の原理解析を行ったところ、Tomcat を起動するためのパラメータに -Djava.endorsed.dirs パラメータがあることが分かりました-Djava.endorsed.dirs 参数

如下图:


-Djava.endorsed.dirs

Java提供了endorsed技术:

关于 endorsed :可以的简单理解为 -Djava.endorsed.dirs 指定的目录面放置的jar文件,将有覆盖系统API的功能。但是能够覆盖的类是有限制的,其中不包括java.lang包中的类(出于安全的考虑)。

为什么必须使用 endorsed 进行替换 jdk 中的类呢?

因为java是采用双亲委派机制进行加载class类的。而jdk提供的类只能由类加载器Bootstrap进行加载。如果你想要在应用程序中替换掉jdk中的某个类是无法做到的,所以java提供了endorsed来达到你想要替换到系统中的类。

示例

修改java.util.ArrayList类中的 get(int index) 方法,在该方法中添加输出获取的值信息,如果是字符串直接输出,如果不是则输出类信息,及加载该元素类的classloader。代码如下:


然后通过打包jar文件,放到一个目录。

我这里是放到 “D:endorsed” 该目录下

测试类


public class Bootstrap {
 public static void main(String[] args) {
  ArrayList<String> list = new ArrayList<String>(10);
  for(int i=0;i<10; i++){
   list.add("test"+i);
   list.get(i);
  }
 }
}

运行的时候加上 -Djava.endorsed.dirs=D:endorsed 参数。如下图:


运行结果

从结果中我们发现,打印的信息不是我们程序中输出的,而是ArrayList.get()

以下に示すように:

-Djava.endorsed.dirs


Java は承認されたテクノロジーを提供します:

endorsed について: これは、単純に -Djava.endorsed で指定されたディレクトリの配置として理解できます。 dirs jar ファイルには、システム API をオーバーライドする関数が含まれます。ただし、カバーできるクラスは限られており、java.lang パッケージ内のクラスは含まれません (セキュリティ上の理由から)。

jdk のクラスを置き換えるのに endorsed を使用する必要があるのはなぜですか? Java は親委任メカニズムを使用してクラスをロードするためです。 jdk によって提供されるクラスは、クラス ローダー ブートストラップによってのみロードできます。アプリケーション内で jdk 内の特定のクラスを置き換えたい場合、それは不可能であるため、システム内で置き換えたいクラスを実現するために Java が提供する endorsed が提供されます。

🎜例🎜🎜🎜🎜 java.util.ArrayList クラスの get(int Index) メソッドを変更し、取得した値情報の出力をこのメソッドは、文字列の場合は直接出力し、そうでない場合はクラス情報を出力し、要素クラスのクラスローダをロードします。コードは次のとおりです: 🎜

🎜🎜🎜次に、jar ファイルをパッケージ化してディレクトリに置きます。 🎜🎜🎜「D:endorsed」ディレクトリに配置しました🎜🎜テストクラス🎜🎜🎜🎜

$JAVA_HOME/jre/lib/endorsed
🎜実行時に -Djava.endorsed.dirs=D:endorsed パラメータを追加します。以下に示すように: 🎜

🎜🎜🎜実行結果🎜

🎜🎜 結果から、印刷された情報はプログラムによって出力されたのではなく、ArrayList.get() メソッドによって出力されたことがわかりました。 🎜🎜🎜🎜承認済み 別の変更方法🎜🎜🎜🎜公式ドキュメントの説明によると: -D パラメータを追加したくない場合、およびこの JDK に基づいて統一された変更を加えたい場合は、変更されたjar: 🎜 🎜🎜🎜🎜rrreee🎜 このようにして、このJDKに基づくすべてのArrayListが変更されました。 ! ! 🎜🎜🎜🎜概要🎜🎜🎜🎜

以上がJava で endorsed を使用して、jdk によって提供されるクラスのインスタンスをオーバーライドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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