> Java > java지도 시간 > 본문

자바의 리플렉션 기본

黄舟
풀어 주다: 2017-02-24 09:51:16
원래의
1046명이 탐색했습니다.


1. 리플렉션이란


모든 클래스에 대해 리플렉션 메커니즘이 실행 상태입니다. , 모든 객체에 대해 이 클래스의 모든 메소드와 속성을 알 수 있으며, 이 <동적 획득/글꼴> 정보와 객체를 동적으로 호출하는 메소드를 호출할 수 있습니다. 반사 메커니즘.

2. Reflection의 역할

  • 1. 디컴파일: .class–>java

  • 2 , 리플렉션 메커니즘을 통해 객체의 속성, 메서드, 생성 방법 등에 액세스

3. 리플렉션의 구체적인 구현

3. 🎜>

  • java.lang.Class;

  • java.lang.reflect.Constructor;

  • java .lang.reflect .Field;

  • java.lang.reflect.Method;

  • java.lang.reflect.Modifier;

3.2 큰 클래스 객체를 얻는 세 가지 방법

모든 클래스는 Object의 하위 클래스이고 Object에 getClass가 있으므로

객체Class -
-public final native Class<?> getClass();

package com.chb.reflectTest;public class Test {
    public static void main(String[] args) throws Exception {        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");    //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}
로그인 후 복사

3.3 객체 생성

Class

객체를 얻은 후 이를 이용하여 객체를 생성하고, newInstance()를 통해 인수 없는 생성자를 호출하여 생성합니다. object.newInstance()는 객체를 반환합니다:

Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
로그인 후 복사
로그인 후 복사
3.4. 데이터 가져오기

  모든 속성과 지정된 속성으로 구분

3.4.1. 🎜>

수정 가져오기

  • 먼저 속성의 getModifiers()를 통해 수정 개체를 가져옵니다.
    • 그런 다음 java.long을 통해 Reflect.Modifier의 toString()은 클래스 및 속성 수정 사항(공개, 정적, 최종 등)을 인쇄합니다.

    • 속성 가져오기
  • 모든 속성 가져오기: Class 객체의 getDeclaedFields()를 통해 필드 배열 반환* *.
    • 속성 유형 가져오기:
  • 속성 객체의 getType()
  • <을 통해( 필드 개체) 🎜>
    • Class<?> cString = Class.forName("java.lang.String");
              //获取累的修饰和名称
              System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
              //获取所有属性
              Field[] fields = cString.getDeclaredFields();
              for (Field field : fields) {
                  System.out.print("\t");
                  System.out.print(
                          Modifier.toString(field.getModifiers())+" "//属性的修饰
                        + field.getType().getSimpleName()+" "
                        + field.getName()+"\n");           
              }
              System.out.println("}");
      로그인 후 복사
      로그인 후 복사

      3.4.2 지정된 속성 가져오기

    • 테스트 개체 만들기:
참고: Use 클래스에 두 가지 속성을 정의했습니다. 하나의 공개, 하나의 비공개, 다음 테스트를 위해 반사가 캡슐화를 깨뜨릴 수 있음

package com.chb.reflectTest;public class User {    
private String name;    
public  String nickName;    
public User() {}    
public User(String name, String nickName) {        
this.name = name;        
this.nickName = nickName;
    }
    setter getter...

}
로그인 후 복사
로그인 후 복사

기존 속성 획득과 반사를 통한 획득 비교:

package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
    public static void main(String[] args) throws Exception {
        //传统获取属性的值
        //1、通过getter,setter
        User user1 = new User();
        user1.setName("lisi");
        System.out.println(user1.getName());
        //2、直接调用属性
        User user2 = new User();
        user2.nickName = "癞皮狗";
        System.out.println(user2.nickName);
        //=========================================
        //通过反射来设置,获取属性。
        Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
        User user = c1.newInstance();
        Field nickField = c1.getDeclaredField("nickName");
        nickField.set(user, "123");
        System.out.println(nickField.get(user));

        Field nameFiled = c1.getDeclaredField("name");
        //Exception in thread "main" java.lang.IllegalAccessException: 
        Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
        nameFiled.setAccessible(true);
        nameFiled.set(user, "oup");
        System.out.println(nameFiled.get(user));

    }
}
로그인 후 복사
로그인 후 복사
반사를 통해 속성 값 설정 , 속성 구별 수정 범위, 개인은 직접 설정할 수 없습니다 는 Java의 안전한 액세스 메커니즘인 액세스 오류를 발생시킵니다. 오류:

Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.
User with modifiers "private"
로그인 후 복사
로그인 후 복사

우리는 Java의 캡슐화를 깨는 메소드를 사용합니다:

nameFiled.setAccessible(true);
로그인 후 복사
로그인 후 복사

1. 반사란

  반사 메커니즘은 모든 클래스에 대해

실행 상태

에 있습니다. object를 사용하면 해당 메소드와 속성을 호출할 수 있습니다.

< 동적으로 정보를 얻고 객체 메소드를 동적으로 호출하는 것을 Java의 반사 메커니즘이라고 합니다.

2. Reflection의 역할

1. 디컴파일: .class–>java

  • 2 , 리플렉션 메커니즘을 통해 객체의 속성, 메서드, 생성 방법 등에 액세스

  • 3. 리플렉션의 구체적인 구현

    3. 🎜>

java.lang.Class;

    java.lang.reflect.Constructor;
  • java .lang.reflect .Field;
  • java.lang.reflect.Method;
  • java.lang.reflect.Modifier;
  • 3.2 큰 클래스 객체를 얻는 세 가지 방법
  • 모든 클래스는 Object의 하위 클래스이고 Object에 getClass가 있으므로

  • <🎜을 얻을 수 있습니다. >객체
-

-

package com.chb.reflectTest;public class Test {
    public static void main(String[] args) throws Exception {        //第一种方式:
        Class<?> c1 = Class.forName("com.chb.reflectTest.Test");        //第二种方式:java中每个类都有class属性
        Class<?> c2 = Test.class;        //第三种方式:每个对象都与getClass()方法
        Class<?> c3 = new Test().getClass();
    }
}
로그인 후 복사
3.3 객체 생성Class
Classpublic final native Class<?> getClass(); 객체를 얻은 후 이를 이용하여 객체를 생성하고, newInstance()를 통해 인수 없는 생성자를 호출하여 생성합니다. object.newInstance()는 객체를 반환합니다:
Class<?> c1 = Class.forName("com.chb.reflectTest.Test");Object o1 = c1.newInstance();
로그인 후 복사
로그인 후 복사

3.4. 데이터 가져오기

  모든 속성과 지정된 속성으로 구분

3.4.1. 🎜>

수정 가져오기

먼저 속성의 getModifiers()를 통해 수정 개체를 가져옵니다.

  • 그런 다음 java.long을 통해 Reflect.Modifier의 toString()은 클래스 및 속성 수정 사항(공개, 정적, 최종 등)을 인쇄합니다.

    • 속성 가져오기

    • 모든 속성 가져오기: Class 객체의 getDeclaedFields()를 통해 필드 배열 반환* *.
  • 속성 유형 가져오기:
    • 通过属性对象(Field对象)的getType()

Class<?> cString = Class.forName("java.lang.String");
        //获取累的修饰和名称
        System.out.print(Modifier.toString(cString.getModifiers())+" class " + cString.getSimpleName()+"{\n");
        //获取所有属性
        Field[] fields = cString.getDeclaredFields();
        for (Field field : fields) {
            System.out.print("\t");
            System.out.print(
                    Modifier.toString(field.getModifiers())+" "//属性的修饰
                  + field.getType().getSimpleName()+" "
                  + field.getName()+"\n");           
        }
        System.out.println("}");
로그인 후 복사
로그인 후 복사

3.4.2 获取指定属性

创建测试对象:
注意: 我在Use类中定义了两个属性, 一个public ,一个private ,是为了下一个测试反射可以打破封装性

package com.chb.reflectTest;public class User {    
private String name;    
public  String nickName;    
public User() {}    
public User(String name, String nickName) {        
this.name = name;        
this.nickName = nickName;
    }
    setter getter...

}
로그인 후 복사
로그인 후 복사

传统属性的获取和通过反射获取对比:

package com.chb.reflectTest;import java.lang.reflect.Field;public class Test1 {
    public static void main(String[] args) throws Exception {
        //传统获取属性的值
        //1、通过getter,setter
        User user1 = new User();
        user1.setName("lisi");
        System.out.println(user1.getName());
        //2、直接调用属性
        User user2 = new User();
        user2.nickName = "癞皮狗";
        System.out.println(user2.nickName);
        //=========================================
        //通过反射来设置,获取属性。
        Class<User> c1 = (Class<User>) Class.forName("com.chb.reflectTest.User");
        User user = c1.newInstance();
        Field nickField = c1.getDeclaredField("nickName");
        nickField.set(user, "123");
        System.out.println(nickField.get(user));

        Field nameFiled = c1.getDeclaredField("name");
        //Exception in thread "main" java.lang.IllegalAccessException: 
        Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.User with modifiers "private"
        nameFiled.setAccessible(true);
        nameFiled.set(user, "oup");
        System.out.println(nameFiled.get(user));

    }
}
로그인 후 복사
로그인 후 복사

通过反射来设置属性的值, 区别属性的修饰范围, 私有的不可以直接设置
会出现访问错误, 也就是java的安全访问机制,报错:

Exception in thread "main" java.lang.IllegalAccessException: Class com.chb.reflectTest.Test1 can not access a member of class com.chb.reflectTest.
User with modifiers "private"
로그인 후 복사
로그인 후 복사

我们通过一个方法·来打破java的封装性:

nameFiled.setAccessible(true);
로그인 후 복사
로그인 후 복사

 以上就是java之反射基础的内容,更多相关内容请关注PHP中文网(www.php.cn)!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿