>  기사  >  Java  >  JAVA 반영 메커니즘(요약 공유)을 이해하게 해주세요.

JAVA 반영 메커니즘(요약 공유)을 이해하게 해주세요.

WBOY
WBOY앞으로
2022-03-16 18:02:451684검색

이 글은 리플렉션이 무엇인지, 리플렉션이 무엇을 할 수 있는지, 리플렉션 관련 API 등 리플렉션 메커니즘과 관련된 문제를 주로 소개하는 java에 대한 관련 지식을 제공합니다. 모든 사람에게 도움이 되기를 바랍니다.

추천 학습: "Java 학습 튜토리얼"

1. 리플렉션이란?

Java 개발에서 매우 중요한 개념은 Java의 중요한 기능 중 하나인 Java Reflection 메커니즘입니다.

리플렉션의 개념은 Smith가 1982년에 처음 제안했습니다. 이는 주로 리플렉션을 통해 개인 메서드와 개인 속성을 호출할 수 있는 자체 상태 또는 동작에 액세스하고 이를 감지하고 수정하는 프로그램의 기능을 의미합니다. 반사의 원리를 사용합니다.

Reflection(리플렉션)은 동적 언어로 간주되는 핵심입니다. 리플렉션 메커니즘을 사용하면 프로그램이 실행 중에 Reflection API를 통해 모든
클래스의 내부 정보를 얻을 수 있으며 내부 속성과 메서드를 직접 조작할 수 있습니다. 어떤 물체의.

클래스에는 멤버 변수, 메서드, 생성자 등과 같은 여러 구성 요소가 있습니다. 리플렉션은 클래스를 로드하고 클래스의 다양한 구성 요소를 분석하는 것입니다.

2. 반사는 무엇을 할 수 있나요?

Java의 리플렉션 메커니즘은 클래스의 기본 구조를 알고 있습니다. 이러한 Java 클래스의 구조를 감지하는 기능을 Java 클래스의 "자체 검사"라고 합니다. 예를 들어, Eclipse에서 한 번의 클릭으로 컴파일 도구는 사용자가 선택할 수 있도록 개체에서 사용할 수 있는 모든 메서드와 속성을 자동으로 나열합니다. 이는 Java 리플렉션 원리를 사용하여 우리가 생성한 객체를 감지하고 자체 검사합니다.

Reflection은 다음을 수행할 수 있습니다.

  • 런타임에 모든 객체가 속하는 클래스를 결정합니다.
  • 런타임에 모든 클래스의 객체를 생성합니다.
  • 런타임에 모든 클래스의 멤버 변수와 메서드를 결정합니다.
  • 런타임에 모든 객체의 멤버 변수 및 메소드 호출
  • 동적 에이전트 생성
  • java.lang.Class: 리플렉션 소스
  • java.lang.reflect.Method: Method

java.lang.reflect.Field : 속성

    java.lang .reflect.Constructor: 생성자
  • java.lang.Class:反射的源头
  • java.lang.reflect.Method:方法
  • java.lang.reflect.Field:属性
  • java.lang.reflect.Constructor:构造器

4、Class类的理解

(1)、介绍:

程序经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾)。接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中。此过程就称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为Class的一个实例。

换句话说,Class的实例就对应着一个运行时类。

加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式
来获取此运行时类。

(2)、类的加载过程:

加载:

在我们new对象或者使用Class.forName("包名.类")时类加载器(ClassLoader)会将类加载到内存中,并且创建一个Class对象

如何获取Class对象?

  • 类.class

  • 对象.getClass()

  • Class.forName

4. 클래스 클래스 이해

(1), 소개:

프로그램은 javac.exe를 통과합니다. 명령을 실행한 후 하나 이상의 바이트코드 파일(.class로 끝남)이 생성됩니다. 그런 다음 java.exe 명령을 사용하여 특정 바이트코드 파일을 해석하고 실행합니다. 특정 바이트코드 파일을 메모리에 로드하는 것과 같습니다. 이 과정을

수업 로딩

이라고 합니다. 메모리에 로드된 클래스를 런타임 클래스라고 하며, 이 런타임 클래스는 Class의 인스턴스로 사용됩니다.

즉, Class의 인스턴스는 런타임 클래스에 해당합니다. 메모리에 로드된 런타임 클래스는 일정 기간 동안 캐시됩니다. 이 시간 내에 우리는 다양한 방법으로 이 런타임 클래스를 얻을 수 있습니다.

(2). 클래스 로딩 프로세스:

Loading:

🎜클래스는 새로운 객체를 사용하거나 Class.forName("Package name.Class")를 사용할 때 로드됩니다. (ClassLoader)는 클래스를 메모리에 로드하고 클래스 객체를 생성합니다🎜🎜🎜클래스 객체를 얻는 방법🎜🎜🎜🎜🎜🎜Class.class🎜 🎜 🎜🎜Object.getClass()🎜🎜🎜🎜Class.forName("패키지 이름. 클래스");🎜🎜🎜🎜🎜🎜링크: 🎜🎜🎜🎜 링크 수행된 주요 작업은 바이트코드가 적합한지 확인하고, 정적 메모리 공간을 할당하고 초기화하는 것입니다(실제 초기화가 아니라 해당 유형의 변수에 int를 0으로, double을 0.0으로 지정하는 것과 같은 기본값을 지정합니다) 🎜🎜 🎜🎜 언로드: 🎜🎜🎜🎜메모리에서 언로드(언로드할 때 신경 쓸 필요가 없으며 JVM에 의해 수행됨) 🎜🎜🎜(3) 클래스 로더 🎜🎜🎜클래스(CLASS)는 그 후에만 실행될 수 있습니다. JVM에 로드됩니다. 지정된 프로그램을 실행할 때 JVM은 요구 사항 및 특정 규칙에 따라 컴파일된 .class 파일을 메모리에 로드하고 이를 완전한 Java 애플리케이션으로 구성합니다. 이 로딩 프로세스는 클래스 로더에 의해 완료됩니다. 특히 ClassLoader 및 해당 하위 클래스에 의해 구현됩니다. 클래스 로더 자체도 클래스입니다. 그 본질은 하드 디스크에서 메모리로 클래스 파일을 읽는 것입니다. 🎜🎜클래스 로더 분류: 🎜
  1. BootStrap:은 주로 핵심 클래스 라이브러리(java.lang.* 등) 로드, ExtClassLoader 구성을 담당합니다. APPClassLoader code>;BootStrap:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoaderAPPClassLoader
  2. ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar包;
  3. AppClassLoader:
  4. ExtClassLoader:jre/lib/ext 디렉토리에 일부 확장 jar 패키지를 로드하는 일을 주로 담당합니다.

AppClassLoader:주로 다음 작업을 담당합니다. 애플리케이션 클래스의 주요 기능 로드(작성한 Java 파일은 이 클래스 로더에 의해 로드됨)

System.out.println("app:" + System.getProperty("java.class.path"));
System.out.println("ext:" + System.getProperty("java.ext.dirs"));
System.out.println("----bootstrap---");
String[] str = System.getProperty("sun.boot.class.path").split(";");

for (String s : str) {
    System.out.println(s);
}

부모 위임(디스패치) 메커니즘:

Hello.class와 같은 파일이 짐을 실은. 사용자 정의 클래스 로더에 관계없이 먼저 AppClassLoader에 로드되었는지 확인합니다. 그렇다면 다시 로드할 필요가 없습니다. 그렇지 않은 경우 상위 로더를 얻은 다음 상위 로더의 loadClass 메서드가 호출됩니다. 같은 방식으로 상위 클래스는 먼저 로드되었는지 확인하고 로드되지 않은 경우 위로 올라갑니다. 이 재귀 프로세스에 주의하세요. Bootstrap classLoader에 도달할 때까지 로드되었는지 확인하고 자체적으로 로드하도록 선택하지 않습니다. BootstrapClassLoader까지는 부모 로더가 없습니다. 이때 로드할 수 있는지 고려하기 시작합니다. 로드할 수 없으면 하위 로더에 싱크하여 맨 아래 레이어까지 로드합니다. 로드할 수 있는 로더가 없으면 ClassNotFoundException이 발생합니다. 그렇다면 다음과 같은 질문이 있는 사람이 있나요?

이 메커니즘을 설계해야 하는 이유는 무엇입니까?

이 설계의 한 가지 장점은 누군가가 시스템 수준 클래스인 String.java를 대체하려는 경우입니다. 이 메커니즘에서 이러한 시스템 클래스는 Bootstrap classLoader에 의해 로드되었습니다(왜? 클래스를 로드해야 할 때 가장 먼저 로드하려고 시도하는 것은 BootstrapClassLoader이기 때문입니다). 따라서 다른 클래스 로더는 다시 로드되지 않습니다. 기회가 생기면 위험한 코드의 이식을 어느 정도 방지할 수 있습니다.

추천 학습: "🎜java tutorial🎜"🎜

위 내용은 JAVA 반영 메커니즘(요약 공유)을 이해하게 해주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제