> Java > java지도 시간 > Java에서 승인을 사용하여 jdk에서 제공하는 클래스의 인스턴스를 재정의하는 방법

Java에서 승인을 사용하여 jdk에서 제공하는 클래스의 인스턴스를 재정의하는 방법

黄舟
풀어 주다: 2017-09-05 10:06:19
원래의
1986명이 탐색했습니다.

이 글에서는 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는 승인된 기술을 제공합니다:

승인 정보: 간단히 -Djava.endorsed에서 지정한 디렉터리 배치로 이해하면 됩니다. dirs jar 파일에는 시스템 API를 재정의하는 기능이 있습니다. 그러나 적용할 수 있는 클래스는 제한되어 있으며 보안상의 이유로 java.lang 패키지에는 클래스가 포함되지 않습니다.

JDK에서 클래스를 대체하기 위해 왜 endorsed를 사용해야 하나요? Java는 클래스를 로드하기 위해 상위 위임 메커니즘을 사용하기 때문입니다. jdk에서 제공하는 클래스는 클래스 로더 Bootstrap을 통해서만 로드할 수 있습니다. 애플리케이션의 jdk에서 특정 클래스를 교체하려는 경우 그렇게 하는 것이 불가능하므로 Java는 시스템에서 교체하려는 클래스를 달성하기 위해 승인을 제공합니다.

🎜Example🎜🎜🎜🎜 java.util.ArrayList 클래스의 get(int index) 메소드를 수정하고, 얻은 값 정보의 출력을 이 메소드는 문자열이면 직접 출력하고, 그렇지 않으면 클래스 정보를 출력하고 요소 클래스의 클래스로더를 로드한다. 코드는 다음과 같습니다: 🎜

🎜🎜🎜그런 다음 jar 파일을 패키지하여 디렉터리에 넣습니다. 🎜🎜🎜"D:endorsed" 디렉터리에 넣어두었습니다. 🎜🎜Test class🎜🎜🎜🎜

$JAVA_HOME/jre/lib/endorsed
로그인 후 복사
🎜실행시 -Djava.endorsed.dirs=D:endorsed 매개변수를 추가해 주세요. 아래와 같이: 🎜

🎜🎜🎜결과 실행🎜

🎜🎜결과에서 인쇄된 정보는 우리 프로그램에서 출력되지 않고 ArrayList.get() 메서드에 의해 인쇄된 것으로 나타났습니다. 🎜🎜🎜🎜승인 또 다른 수정 방법🎜🎜🎜🎜공식 문서 설명에 따르면: -D 매개변수를 추가하고 싶지 않고 이 JDK 아래의 모든 것을 균일하게 변경하려면 수정된 내용을 넣을 수 있습니다. jar in: 🎜 🎜🎜🎜🎜rrreee🎜 이런 식으로 이 JDK를 기반으로 하는 모든 ArrayList가 변경되었습니다! ! ! 🎜🎜🎜🎜요약🎜🎜🎜🎜

위 내용은 Java에서 승인을 사용하여 jdk에서 제공하는 클래스의 인스턴스를 재정의하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿