이 글에서는 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는 시스템에서 교체하려는 클래스를 달성하기 위해 승인을 제공합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!