자바 면접 문제 정리 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);
    }
}

사용 하 는 것 은 가장 간단 한 요구 일 뿐 사용 하 는 환경 을 이해 해 야 자신 이 유연 하 게 사용 할 수 있 습 니 다. 나중에 더 깊 은 경험 을 가지 고 보충 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기