Java의 반사 메커니즘의 예에 대한 자세한 설명
이 글은 주로 Java 반사 메커니즘 예제에 대한 자세한 설명을 소개합니다. 다음은 Java의 반사 메커니즘에 대한 자세한 분석을 참조할 수 있습니다.
Java 반사 메커니즘 예제에 대한 자세한 설명
1. JAVA는 동적 언어인가요?
일반적으로 동적 언어라고 하면 프로그램이 실행되는 동안 프로그램 구조나 변수 유형이 변경될 수 있다는 의미입니다. 이러한 관점에서 보면 Java는 C++와 마찬가지로 동적 언어가 아닙니다.
하지만 JAVA에는 리플렉션이라는 매우 중요한 동적 관련 메커니즘이 있습니다. 리플렉션을 통해 Java는 런타임 시 컴파일 중에 완전히 합산된 클래스를 로드, 감지 및 사용할 수 있으며 해당 개체 엔터티를 생성하고 해당 메서드를 호출하거나 속성에 대한 값을 설정할 수 있습니다. 따라서 Java는 반동적 언어로 간주됩니다.
반사 개념:
Java의 반사 메커니즘은 실행 상태에서 모든 클래스에 대해 이 클래스의 모든 속성과 메서드를 알 수 있음을 의미합니다.
모든 객체에 대해 해당 메서드 중 하나를 A라고 부를 수 있습니다.
동적으로 정보를 얻고 개체 메서드를 동적으로 호출하는 기능을 Java 언어의 반영 메커니즘이라고 합니다.
2. 동적 속성
2.1, 동적 속성
런타임에 개체 인스턴스 생성
실행; 해당 기간 동안 메소드가 호출됩니다.
2.2. Java 리플렉션 메커니즘이 구현할 수 있는 함수
런타임에 모든 객체가 속한 클래스를 판단합니다.런타임에 모든 클래스의 객체를 구성합니다. 런타임 시 모든 클래스의 메서드 및 속성
런타임 시 개체의 메서드 호출
동적 프록시 생성
Java 프로그램의 많은 개체는 런타임 시 두 가지 유형으로 나타납니다. 유형: 컴파일 -타임 유형과 런타임 유형
컴파일 타임 유형은 객체를 선언할 때 사용된 유형에 따라 결정되고, 런타임 유형은 객체에 실제로 할당된 유형에 따라 결정됩니다.
예:
Person p =new Student();
컴파일 타임 유형은 Person이고 런타임에는 Student입니다
또한 프로그램은 런타임 중에 외부에서 전달된 객체를 받을 수도 있습니다. 객체의 컴파일 타임 유형은 Object이지만 프로그램에는 필요합니다. 객체의 런타임 유형을 호출합니다. 이러한 문제를 해결하려면 프로그램은 런타임에 개체와 클래스에 대한 실제 정보를 검색해야 합니다. 그러나 객체와 클래스가 어떤 클래스에 속할지 컴파일 타임에 예측하는 것이 불가능하고 프로그램이 런타임 정보에만 의존하여 객체와 클래스의 실제 정보를 검색하는 경우 이때 리플렉션을 사용해야 합니다
3. Java Reflection API리플렉션 API는 현재 JAVA 가상 머신의 클래스, 인터페이스 또는 개체에 대한 정보를 생성하는 데 사용됩니다.
클래스 클래스: 클래스의 속성, 메서드 및 기타 콘텐츠 정보를 얻을 수 있는 리플렉션의 핵심 클래스입니다.
Field 클래스: Java.lang.reflect 클래스의 속성을 나타내며, 클래스의 속성 값을 가져오고 설정할 수 있습니다.메서드 클래스: Java.lang.reflect. 클래스의 메소드에 대한 정보를 얻거나 메소드를 실행하는 데 사용할 수 있는 클래스의 메소드를 나타냅니다.
Construcor 클래스: Java.lang.reflect. 클래스의 생성자 메서드를 나타냅니다.
Person 클래스
package com.pb.Reflect.classinfo; public class Person { private String name; private String gender; private int age; private Person() { // } public Person(String name, String gender, int age) { super(); this.name = name; this.gender = gender; this.age = age; } //getter、和setter方法 private String getName() { return name; } private void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "姓名:"+name+"年龄: "+age; } }
reflection 사용:
package com.pb.Reflect.classinfo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.swing.JOptionPane; /* * 通过用户输入类的全路径,来获取该类的成员方法和属性 * Declared获取全部不管是私有和公有 * 1.获取访问类的Class对象 * 2.调用Class对象的方法返回访问类的方法和属性信息 */ public class ReflectDemo { /* * 构造方法 */ public ReflectDemo(){ //用户输入类的全路径径 //使用String组件 String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径"); //使用Class.forName方法根据输入的类的全路径 返回该类的Class对象 try { Class cla = Class.forName(classpsth); //利用Class对象的cla的自审,返回方法对象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========获取方法信息============"); for (Method meth : method) { //遍历method数组,并输出方法信息 System.out.println(meth.toString()); } System.out.println("========获取出方法信息结束============"); //获取属性利用Class对象的cla的自审,返回成员属性对象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========获取成员属性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========获取成员属性信息结束============"); //获取属性利用Class对象的cla的自审,返回构造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========获取成员构造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========获取成员构造方法信息结束============"); } catch (ClassNotFoundException e) { e.printStackTrace(); System.out.println("路径输入错误!"); } } }
package com.pb.Reflect.classinfo; public class TestReflection { public static void main(String[] args) { ReflectDemo rd=new ReflectDemo(); } }
com.pb.Reflect.classinfo.Person을 입력하세요.
결과:
========获取方法信息============ public java.lang.String com.pb.Reflect.classinfo.Person.getGender() public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String) public int com.pb.Reflect.classinfo.Person.getAge() public void com.pb.Reflect.classinfo.Person.setAge(int) public java.lang.String com.pb.Reflect.classinfo.Person.toString() private java.lang.String com.pb.Reflect.classinfo.Person.getName() private void com.pb.Reflect.classinfo.Person.setName(java.lang.String) ========获取出方法信息结束============ ========获取成员属性信息============ private java.lang.String com.pb.Reflect.classinfo.Person.name private java.lang.String com.pb.Reflect.classinfo.Person.gender private int com.pb.Reflect.classinfo.Person.age ========获取成员属性信息结束============ ========获取构造方法信息============ private com.pb.Reflect.classinfo.Person() public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int) ========获取构造方法信息结束============
5. 리플렉션 사용 단계
5.1. 단계
Java.lang.reflect
클래스를 조작하려는 Java.lang.Class 객체 가져오기
Class의 메서드 호출 이 정보를 조작하려면 리플렉션 API를 사용하세요
객체의 getClass() 메서드를 호출하세요
Person p = new Person(); Class cla=p.getClass();
클래스를 얻으려면 특정 클래스의 클래스 속성을 호출하세요. 클래스에 해당하는 객체
Class cls=Person.class;
Class 클래스의 forName() 정적 메소드를 사용합니다
Class cla=Class.forName(“类的全路径”);
6. 두 번째 메소드는 object
Person 클래스의 getClass() 메소드입니다. , 객체가 선언되기 때문에 생성자 메서드는 public
package com.pb.Reflect.classinfo; public class Person { private String name; private String gender; private int age; public Person() { // } public Person(String name, String gender, int age) { super(); this.name = name; this.gender = gender; this.age = age; } //getter、和setter方法 private String getName() { return name; } private void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "姓名:"+name+"年龄: "+age; } }
Reflection 사용:
package com.pb.Reflect.classinfo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.swing.JOptionPane; /* * 通过用户输入类的全路径,来获取该类的成员方法和属性 * Declared获取全部不管是私有和公有 * 1.获取访问类的Class对象 * 2.调用Class对象的方法返回访问类的方法和属性信息 */ public ReflectDemo(Person p){ Class cla=p.getClass(); //利用Class对象的cla的自审,返回方法对象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========获取方法信息============"); for (Method meth : method) { //遍历method数组,并输出方法信息 System.out.println(meth.toString()); } System.out.println("========获取出方法信息结束============"); //获取属性利用Class对象的cla的自审,返回成员属性对象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========获取成员属性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========获取成员属性信息结束============"); //获取属性利用Class对象的cla的自审,返回构造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========获取成员构造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========获取成员构造方法信息结束============"); } }
Test class
package com.pb.Reflect.classinfo; public class TestReflection { public static void main(String[] args) { Person p=new Person(); ReflectDemo rd=new ReflectDemo(p); } }
========获取方法信息============ public java.lang.String com.pb.Reflect.classinfo.Person.getGender() public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String) public int com.pb.Reflect.classinfo.Person.getAge() public void com.pb.Reflect.classinfo.Person.setAge(int) public java.lang.String com.pb.Reflect.classinfo.Person.toString() private java.lang.String com.pb.Reflect.classinfo.Person.getName() private void com.pb.Reflect.classinfo.Person.setName(java.lang.String) ========获取出方法信息结束============ ========获取成员属性信息============ private java.lang.String com.pb.Reflect.classinfo.Person.name private java.lang.String com.pb.Reflect.classinfo.Person.gender private int com.pb.Reflect.classinfo.Person.age ========获取成员属性信息结束============ ========获取成员构造方法信息============ public com.pb.Reflect.classinfo.Person() public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int) ========获取成员构造方法信息结束============
7. .class 속성 세 번째 메소드 클래스
Person 클래스는 위와 동일
테스트 클래스:
package com.pb.Reflect.classinfo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflection { public static void main(String[] args) { /*第二种方法 Person p=new Person(); ReflectDemo rd=new ReflectDemo(p); */ /* * 第三种方式.class属性 */ Class cla=Person.class; //利用Class对象的cla的自审,返回方法对象集合 Method [] method=cla.getDeclaredMethods(); //返回所有的方法 System.out.println("========获取方法信息============"); for (Method meth : method) { //遍历method数组,并输出方法信息 System.out.println(meth.toString()); } System.out.println("========获取出方法信息结束============"); //获取属性利用Class对象的cla的自审,返回成员属性对象集合 Field [] field=cla.getDeclaredFields(); System.out.println("========获取成员属性信息============"); for (Field f : field) { System.out.println(f.toString()); } System.out.println("========获取成员属性信息结束============"); //获取属性利用Class对象的cla的自审,返回构造方法集合 Constructor [] constructor=cla.getDeclaredConstructors(); System.out.println("========获取成员构造方法信息============"); for (Constructor constru : constructor) { System.out.println(constru.toString()); } System.out.println("========获取成员构造方法信息结束============"); } }
결과:
위와 동일
========获取方法信息============ public java.lang.String com.pb.Reflect.classinfo.Person.getGender() public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String) public int com.pb.Reflect.classinfo.Person.getAge() public void com.pb.Reflect.classinfo.Person.setAge(int) public java.lang.String com.pb.Reflect.classinfo.Person.toString() private java.lang.String com.pb.Reflect.classinfo.Person.getName() private void com.pb.Reflect.classinfo.Person.setName(java.lang.String) ========获取出方法信息结束============ ========获取成员属性信息============ private java.lang.String com.pb.Reflect.classinfo.Person.name private java.lang.String com.pb.Reflect.classinfo.Person.gender private int com.pb.Reflect.classinfo.Person.age ========获取成员属性信息结束============ ========获取成员构造方法信息============ public com.pb.Reflect.classinfo.Person() public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int) ========获取成员构造方法信息结束============
위 내용은 Java의 반사 메커니즘의 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.

캡슐은 3 차원 기하학적 그림이며, 양쪽 끝에 실린더와 반구로 구성됩니다. 캡슐의 부피는 실린더의 부피와 양쪽 끝에 반구의 부피를 첨가하여 계산할 수 있습니다. 이 튜토리얼은 다른 방법을 사용하여 Java에서 주어진 캡슐의 부피를 계산하는 방법에 대해 논의합니다. 캡슐 볼륨 공식 캡슐 볼륨에 대한 공식은 다음과 같습니다. 캡슐 부피 = 원통형 볼륨 2 반구 볼륨 안에, R : 반구의 반경. H : 실린더의 높이 (반구 제외). 예 1 입력하다 반경 = 5 단위 높이 = 10 단위 산출 볼륨 = 1570.8 입방 단위 설명하다 공식을 사용하여 볼륨 계산 : 부피 = π × r2 × h (4

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.
