자바 면접 문제 정리 1 (반사)
답:
1. 역할:
설정 파일 을 통 해 동적 설정 과 로드 클래스 를 통 해 소프트웨어 공학 이론 에서 언급 한 클래스 와 클래스, 모듈 과 모듈 간 의 디 결합 을 실현 할 수 있 습 니 다.반사 가장 전형 적 인 응용 은 spring 프레임 워 크 입 니 다.
2. 정의 반 사 는 쉽게 말 하면 동적 로드 대상 이 고 대상 을 분석 하 는 것 이다.자바 에서 의 반사 메커니즘 은 운행 상태 에서 임의의 클래스 에 대해 이 클래스 의 모든 속성 과 방법 을 알 수 있 음 을 말한다.임의의 대상 에 대해 그 임의의 방법 을 호출 할 수 있다. 이런 동적 획득 정보 와 동적 호출 대상 방법의 기능 을 자바 언어의 반사 메커니즘 이 라 고 한다.
2.1 동적 성질 이 실 행 될 때 대상 인 스 턴 스 생 성;실행 기간 호출 방법;실행 시 속성 2.2 자바 반사 체 제 를 변경 하여 실현 할 수 있 는 기능 은 실행 할 때 임의의 대상 이 속 한 클래스 를 판단 하여 실행 할 때 임의의 클래스 를 구성 하 는 대상 이 실행 할 때 임의의 클래스 가 가지 고 있 는 방법 과 속성 을 판단 하여 실행 할 때 임의의 대상 을 호출 하 는 방법 으로 동적 프 록 시 를 생 성 합 니 다. 2.3 자바 반사 응용 장 소 는 자바 프로그램 에서 많은 대상 이 실 행 될 때 발생 합 니 다.현재 두 가지 유형: 컴 파일 할 때 유형 과 실행 할 때 유형 을 컴 파일 할 때 사용 하 는 유형 에 의 해 결 정 됩 니 다. 실행 할 때 유형 은 실제 대상 에 게 부여 하 는 유형 에 의 해 결 정 됩 니 다. 예 를 들 어 Person p = new Student ();컴 파일 시 형식 은 Person 이 고, 실행 시 Student 이 며, 프로그램 이 실 행 될 때 외부 에서 들 어 오 는 대상 을 받 을 수 있 습 니 다. 이 대상 의 컴 파일 시 형식 은 Object 이지 만, 프로그램 은 이 대상 이 실 행 될 때의 형식 을 호출 하 는 방법 이 필요 합 니 다.이 문제 들 을 위해 서 는 프로그램 이 실 행 될 때 대상 과 클래스 의 진실 한 정 보 를 발견 해 야 한다.그러나 컴 파일 할 때 이 대상 과 클래스 가 어떤 클래스 에 속 할 지 예측 할 수 없다 면 프로그램 은 실행 시 정보 에 만 의존 하여 이 대상 과 클래스 의 진실 한 정 보 를 발견 해 야 한다. 이때 반 사 를 사용 해 야 한다.
3. JAVA 반사 API
반사 API 는 현재 JAVA 가상 컴퓨터 의 클래스, 인터페이스 또는 대상 에 대한 정 보 를 생 성 하 는 데 사 용 됩 니 다.Class 클래스: 반 사 된 핵심 클래스 로 클래스 의 속성, 방법 등 내용 정 보 를 얻 을 수 있 습 니 다.Field 클래스: 자바. lang. reflect. 클래스 의 속성 을 표시 합 니 다. 클래스 의 속성 값 을 가 져 오고 설정 할 수 있 습 니 다.Method 클래스: 자바. lang. reflect.클래스 를 표시 하 는 방법 은 클래스 의 방법 에 대한 정 보 를 얻 거나 실행 방법 인 Construcor 클래스: 자바. lang. reflect 를 사용 할 수 있 습 니 다.클래스 를 나타 내 는 구조 방법.
다음은 예 를 들 어 다음 과 같다.
첫 번 째 방식 은 클래스 의 전체 경 로 를 통 해 이 루어 진다.
반 사 될 Person 클래스 를 새로 만 듭 니 다.
package com.test.Reflect;
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;
}
}
첫 번 째 데모 조회 클래스 의 정보 및 출력
package com.test.Reflect;
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 ReflectDemo1 {
/*
*
*/
public ReflectDemo1(){
//
// 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.test.Reflect;
/**
*
* @author Admin
*
*/
public class TestReflection {
public static void main(String[] args) {
ReflectDemo1 rd=new ReflectDemo1();
}
}
실행 후 입력 클래스 의 전체 경 로 를 입력 하 는 간단 한 팝 업 창 이 있 습 니 다: com. test. Reflect. Person
출력 결 과 는: = = = = = = = = 가 져 오 는 방법 정보 = = = = = = = = = = = public java. lang. String com. test. Reflect. Person. toString () private java. lang. String com. test. Reflect. Person. getName () private void com. test. Reflect. Person. setName (java. lang. String) public java. lang. String com. test. Reflect. Person. getGender () public void com. test. Reflect. Person. set Gender(java.lang.String) public void com.test.Reflect.Person.setAge(int) public int com.test.Reflect.Person.getAge()= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = pri.vate com. test. Reflect. Person () public com. test. Reflect. Person (java. lang. String, java. lang. String, int) = = = = = = = = = 구성원 구성 방법 정보 획득 종료 = = = = = = = = = = = = = = = = = = = = = =
두 번 째 방식 대상 의 getClass ()
우선 위의 Person 클래스 를 사용 합 니 다. 구조 함수 의 속성 을 default 으로 수정 할 뿐 입 니 다.
public class Person {
private String name;
private String gender;
private int age;
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;
}
ReflectDemo 류 는 기본적으로 변 하지 않 습 니 다. 다만 cla 의 전송 방식 이 바 뀌 었 을 뿐 입 니 다. Class cla=p.getClass();
public ReflectDemo2(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("======== ============");
}
테스트 클래스 는 다음 과 같 습 니 다:
결 과 는 위의 출력 결과 와 같다.
= = = = = = = = = = = = = = = = = = = = = = = public java. lang. String com. test. Reflect. Person. toString () private java. lang. String com. test. Reflect. Person. getName () private void com. test. Reflect. Person. setName (java. lang. String) public java. lang. String com. test. Reflect. Person. getGender () public void com. test. Reflect. Person. setGender (java. lang. String) public int com.test.Reflect.Person.getAge() public void com.test.Reflect.Person.setAge(int)= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = com.. test. Reflect. Person () public com. test. Reflect. Person (java. lang. String, java. lang. String, int) = = = = = = = = 구성원 구성 방법 정보 획득 종료 = = = = = = = = = = = = = = = =
세 번 째 방식 은 바로. class 속성 을 사용 하 는 것 입 니 다.
클래스 이름. class 를 Class cla 에 직접 할당 하면 위 와 같은 종류의 정 보 를 계속 출력 할 수 있 습 니 다. 여 기 는 군말 하지 않 습 니 다.
public class TestReflection {
public static void main(String[] args) {
// ReflectDemo1 rd=new ReflectDemo1();
Person person = new Person();
ReflectDemo2 reflectDemo2 = new ReflectDemo2(person);
}
}
사용 하 는 것 은 가장 간단 한 요구 일 뿐 사용 하 는 환경 을 이해 해 야 자신 이 유연 하 게 사용 할 수 있 습 니 다. 나중에 더 깊 은 경험 을 가지 고 보충 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.