>  기사  >  Java  >  자바 리플렉션이란 무엇입니까? Java 반사 메커니즘에 대한 자세한 소개

자바 리플렉션이란 무엇입니까? Java 반사 메커니즘에 대한 자세한 소개

不言
不言원래의
2018-09-19 14:30:161965검색

이 기사에서는 Java 리플렉션이 무엇인지 설명합니다. Java 반사 메커니즘에 대한 자세한 소개는 특정 참조 가치가 있습니다. 도움이 필요한 친구가 참조할 수 있기를 바랍니다.

1. 개념

자바 리플렉션(Reflection)은 자바 프로그램이 실행될 때까지 이름을 알 수 없는 클래스를 로드하고, 클래스의 완전한 구성 방법을 얻고, 객체를 인스턴스화하고, 해당 클래스에 대한 값을 설정할 수 있음을 의미합니다. 개체 속성을 사용하거나 개체 메서드를 호출하세요. 런타임에 동적으로 클래스 정보를 얻고 객체 메소드를 동적으로 호출하는 기능을 Java의 반사 메커니즘이라고 합니다.

2. 클래스 클래스

클래스 클래스는 Object 클래스에서 상속되며 클래스 또는 인터페이스의 런타임 정보를 캡슐화합니다. 이 정보는 클래스 클래스의 메서드를 호출하여 얻을 수 있습니다. . 이 클래스 클래스를 이해하는 방법은 무엇입니까? 일반 클래스가 모든 객체 메서드와 속성의 컬렉션이라면 이 클래스 클래스는 모든 일반 클래스의 컬렉션으로 이해될 수 있습니다.

다음은 클래스 클래스를 얻는 여러 가지 방법입니다.

public class TestClass {
    public static void main(String[] args) throws ClassNotFoundException {
        // 1、 Class.forName();
        Class<?> aClass0 = Class.forName("java.lang.Object");
        // 2、类名.Class
        Class<Integer> aClass1 = Integer.class;
        // 3、包装类.TYPE —— 返回基本类型的 Class 引用,基本类型在虚拟机运行时就已经加载了它的Class
        Class<Integer> aClass2 = Integer.TYPE;
        // 4、对象名.getClass()
        String str = "Hello, World";
        Class<? extends String> aClass3 = str.getClass();
        // 5、Class类.getSuperClass() —— 获得父类的 Class 对象
        Class<?> aClass4 = aClass3.getSuperclass();

        System.out.println(aClass0.getName());
        System.out.println(aClass1.getName());
        System.out.println(aClass2.getName());
        System.out.println(aClass3.getName());
        System.out.println(aClass4.getName());
    }
}

3. 클래스 정보 얻기

Java의 반사 메커니즘을 테스트하기 위해 네 가지 캡슐화 속성을 포함하는 한 쌍의 새로운 상위-하위 클래스를 만들었습니다. 여러 유형의 정보 획득 테스트:

Vehicle.java

vpublic class Vehicle {
    private String color;
    protected Integer seat;
    int year;
    public Date createdOn;
    private String getColor() {
        return color;
    }
    protected Integer getSeat() {
        return seat;
    }
    int getYear() {
        return year;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
}

Car.java

public class Car extends Vehicle {
    private String brand;
    protected Integer a;
    int b;
    public Date updatedOn;
    public Car(){}
    private Car(String brand, Integer a, int b, Date updatedOn) {
        this.brand = brand;
        this.a = a;
        this.b = b;
        this.updatedOn = updatedOn;
    }
    private String getBrand() {
        return brand;
    }
    protected Integer getA() {
        return a;
    }
    int getB() {
        return b;
    }
    public Date getUpdatedOn() {
        return updatedOn;
    }
}

1. 메소드 획득

클래스 클래스는 주로 다음 두 가지 방법으로 메소드를 획득합니다.

Method[] getMethods( ) 클래스 또는 인터페이스의 액세스 가능한 모든 공용 메서드(상속된 공용 메서드 포함)를 반환합니다.

Method[] getDeclaredMethods()는 이 클래스 또는 인터페이스의 모든 메서드를 반환합니다(상속된 메서드 제외).

public class TestMethod {
    public static void main(String[] args) {
        Class<Car> carClass = Car.class;
        Method[] methods = carClass.getMethods();
        Method[] declaredMethods = carClass.getDeclaredMethods();

        for (Method method : methods) {
        //for (Method method : declaredMethods) {
            System.out.println("方法名:" + method.getName());
            System.out.println("该方法所在的类或接口:" + method.getDeclaringClass());
            System.out.println("该方法的参数列表:" + method.getParameterTypes());
            System.out.println("该方法的异常列表:" + method.getExceptionTypes());
            System.out.println("该方法的返回值类型:" + method.getReturnType());
        }
    }
}

2. 속성 가져오기

클래스 클래스는 주로 다음 두 가지 방법으로 속성을 얻습니다.

Field[] getFields(): 클래스 또는 인터페이스의 액세스 가능한 모든 공개 속성(상속된 공개 속성 포함)을 저장합니다.

Field[] getDeclaredFields(): 클래스 또는 인터페이스의 모든 속성을 저장합니다(상속된 속성 제외).

public class TestField {
    public static void main(String[] args) {
        Class<Car> carClass = Car.class;
        Field[] fields = carClass.getFields();
        Field[] declaredFields = carClass.getDeclaredFields();
        //for (Field field : fields) {
        for (Field field : declaredFields) {
            System.out.println("属性名称是:" + field.getName());
            System.out.println("该属性所在的类或接口是:" + field.getDeclaringClass());
            System.out.println("该属性的类型是:" + field.getType());
            // field.getModifiers() 以整数形式返回由此 Field 对象表示的属性的 Java 访问权限修饰符
            System.out.println("该属性的修饰符是:" + Modifier.toString(field.getModifiers()));
        }
    }
}

3. 생성자 가져오기

Class 클래스는 주로 다음 두 가지 방법으로 생성자 메서드를 가져옵니다.

Constructor6b3d0130bba23ae47fe2b8e8cddf0195[] getConstructors(): 클래스 또는 인터페이스의 모든 공용 생성자를 반환합니다.

Constructor< ;?>[] getDeclaredConstructors(): 클래스 또는 인터페이스의 모든 구성 메소드를 반환합니다

public class TestConstructor {
    public static void main(String[] args) throws NoSuchMethodException {
        Class<Car> carClass = Car.class;
        Constructor<?>[] constructors = carClass.getConstructors();
        Constructor<?>[] declaredConstructors = carClass.getDeclaredConstructors();
        Constructor<Car> carConstructor = carClass.getDeclaredConstructor(String.class, Integer.class, Integer.TYPE, Date.class);
        //for (Constructor constructor : declaredConstructors) {
        for (Constructor constructor : constructors) {
            System.out.println("该构造器的名称是:" + constructor.getName());
            System.out.println("该构造器所在的类或接口是:" + constructor.getDeclaringClass());
            //返回构造方法的参数类型
            constructor.getParameterTypes();
        }
    }
}

4. 동적 호출

지금까지 Class 클래스의 메소드를 통해 해당 클래스 속성, 메소드 및 메소드를 얻었습니다. 생성자 세부정보. 다음으로 이 정보를 사용하여 객체를 동적으로 생성하고 속성을 수정하며 메서드를 동적으로 호출합니다.

아아아아

위 내용은 자바 리플렉션이란 무엇입니까? Java 반사 메커니즘에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.