>Java >java지도 시간 >Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?

Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?

王林
王林앞으로
2023-05-21 12:34:201066검색

클래스 선언 주기

java 소스 코드------>javac--------------->java 바이트코드 파일------------ ---> ;java------>클래스 객체(메모리 공간: 메타공간, 로컬 메모리)------------ ------ ------new--------->인스턴스화된 객체------gc---- ------- -->객체 언로드

Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?

클래스 객체는 다양한 단계에서 얻을 수 있습니다

  • object.getClass() (메모리 단계)

  • Test.class (메타공간)

  • class.forName( "클래스 전체 이름: 패키지 이름 + 클래스 이름"): 메모리 공간(하드 디스크)에 들어가지 않고도 객체를 가져올 수 있습니다

예를 들어 jdbc를 사용하여 데이터베이스를 작동할 때 이 클래스가 메모리에 들어가기 전에 , 클래스의 전체 이름(패키지 이름 + 클래스 이름)을 사용할 수 있습니다. 클래스를 호출하고

Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?

을 사용하여 클래스 객체

  • Class.forName("클래스 전체 이름")을 가져옵니다. 구성 파일, 구성 파일에서 클래스 이름 정의, 구성 파일 읽기, 클래스 로드

  • classname.class: 주로 매개변수 전달에 사용됨

  • object name.getClass(): 클래스 객체의 객체 획득에 주로 사용

요약: 동일한 클래스 로더에 의해 로드된 파일은 프로그램 실행 중에 한 번만 로드됩니다. 어떤 방법을 사용하든 얻은 클래스 객체는 동일합니다

코드 예:

package com.reflect;
public class TestReflectPerson {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.class.forName()
        Class class1=Class.forName("com.reflect.Person");
        System.out.println(class1);
        //2.类名.class
        Class class2=Person.class;
        System.out.println(class2);
        //2.对象名.getClass()
        Class class3=new Person().getClass();
        System.out.println(class3);
        System.out.println(class1==class2);  //true
        System.out.println(class2==class3);  //true
    }
}

클래스 객체의 기능

멤버 변수 가져오기: 모두 가져오기: class object.getDeclaredFields(), 하나 가져오기: class object.getDeclaredField()

  • set value set(Object obj,Object value)

  • 값 가져오기 get(Object obj)

권한이 수정된 멤버 변수를 가져오면 설정 값을 얻으려면 setAccessible(true)을 사용해야 합니다.------폭력적인 반사

Member 메서드: Class object.getDeclaredMethods()

invoke(Object 메서드 실행 object,Object… agrs) (매개변수 수는 임의, 선택 사항)

메서드 이름 가져오기 getName()

구성 메서드: 클래스 object.getDeclaredConstructors()

비인수 구성 메서드가 있어야 하지만, newInstance() 메소드를 사용하면 생성자를 구하고 객체를 얻는 단계를 생략할 수 있습니다

이 메소드에는 실제 매개변수를 할당하기 위한 실제 생성 메소드가 필요합니다

//获得构造方法对象,
        Constructor cons1 = pcla.getDeclaredConstructor(String.class, int.class);
        Person p2 = (Person)cons1.newInstance("李四",19);
        System.out.println("p2:"+p2.getName());

newInstance() 객체를 생성하기 위해 매개변수 없는 생성자를 만드는 경우 객체를 생성하기 위해 객체 클래스를 사용할 수 있습니다. 생성자 객체 가져오기를 건너뛰세요

Get

클래스 이름 가져오기: getName() 전체 이름 인쇄: 클래스 이름 + 패키지 이름

단일 클래스만 인쇄하고 싶습니다. name: getSimpleName()

Get the class Member 변수 이름

Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?

Properties 파일: 콘텐츠는 k=v,

Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?

형식의 등호로 연결됩니다. 코드 예:

package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflectPerson {
    public static void main(String[] args) throws Exception {
       /* //1.class.forName()
        Class class1=Class.forName("com.reflect.Person");
        System.out.println(class1);
        //2.类名.class
        Class class2=Person.class;
        System.out.println(class2);
        //2.类名.getClass()
        Class class3=new Person().getClass();
        System.out.println(class3);
        System.out.println(class1==class2);
        System.out.println(class2==class3);*/
        //获取对象
        Class tclass=Class.forName("com.reflect.Person");
        //通过类对象获取成员变量们
        Field[] fields = tclass.getDeclaredFields();
        System.out.println("获取Person对象的所有属性对象");
        for (Field field:fields){
           System.out.println(field);
       }
        //指定获取Person对象的属性对象
        System.out.println("指定获取Person对象的属性对象");
        Field age=tclass.getDeclaredField("age");
        System.out.println("age:"+age);
        //通过类对象获取所有的构造方法
        Constructor[] constructors = tclass.getDeclaredConstructors();
        System.out.println("获取Person的所有构造方法对象");
        for (Constructor constructor:constructors){
            System.out.println(constructor);
        }
        //通过类对象获取无参的构造方法
        Constructor constructor = tclass.getDeclaredConstructor();
        System.out.println("constructor:"+constructor);
        //通过类对象获取有参的构造方法
        Constructor constructor1 = tclass.getDeclaredConstructor(String.class,int.class);
        System.out.println("constructor1:"+constructor1);
        //通过类对象获取所有的成员方法
        Method[] methods = tclass.getDeclaredMethods();
        for (Method method:methods){
            System.out.println("method:"+method);
        }
        //通过类对象获取getAge成员方法
        Method getAge = tclass.getDeclaredMethod("getAge");
        System.out.println("getAge:"+getAge);
        //通过类对象获取getAge成员方法
        Method setAge = tclass.getDeclaredMethod("setAge", int.class);
        System.out.println("setAge:"+setAge);
    }
}

Get member 변수 코드 예:

package com.reflect;
import java.lang.reflect.Field;
public class TestField {
    public static void main(String[] args) throws Exception {
        Class pcla=Person.class;
        /*//获取公共访问权限的成员变量
        Field[] fields = pcla.getFields();
        for (Field field:fields){
            System.out.println("getFild:"+field);
        }
        System.out.println();
        //获取所有访问权限的成员变量
        Field[] fielddes = pcla.getDeclaredFields();
        for (Field field:fielddes){
            System.out.println("field:"+field);
        }*/
        Field name = pcla.getDeclaredField("name");
        System.out.println(name);
        Person person=new Person();
        //暴力反射:获取任意访问权限修饰符的安全检查
        name.setAccessible(true);
        //获取公共成员变量的值
        Object value = name.get(person);
        System.out.println(value);
        //获取任意访问权限的成员变量的值
        Object value2 = name.get(person);
        System.out.println("value2:"+value2);
        //设置任意访问权限的成员变量的值
        name.set(person,"张三");
        Object value3=name.get(person);
        System.out.println("name:"+value3);
    }
}

개인 변수의 값을 얻는 방법

//暴力反射:获取任意访问权限修饰符的安全检查
name.setAccessible(true);

메인 메소드가 있는지 여부에 따라 프로세스와 스레드를 판단합니다.

프로세스: 자체 메인 메소드가 포함되어 있으며 자체 메인 메소드에 의존하여 시작할 수 있습니다. 메인 메소드라고 합니다

스레드: 자체 메인 메소드가 없으며 실행하려면 다른 도구에 의존해야 합니다.

예: 서블릿은 Tomcate의 도움으로 자체적으로 실행되어야 합니다. 주요 방법

리플렉션 배경(기억)

예: tomcate 도구를 사용하여 서블릿을 실행하면 프로젝트를 실행할 때 tomacate가 클래스의 리소스에 액세스할 수 없어 리플렉션이 발생합니다

Tomcate가 객체를 가져올 수 없는 이유 of new

자세한 설명: tomacate가 먼저 생성되어 작성되고 클래스가 나중에 작성되므로 tomcate는 new를 통해 호출할 수 없습니다. 객체가 무엇인지 패키지 스캐닝을 통해 얻을 수 있습니다. 하지만 이 메서드는 new를 사용할 수 없으므로 리플렉션이 발생합니다.

ate에는 자체 주요 메소드가 있습니다

reflection의 배경

예: tomacate 도구를 사용하여 서블릿을 실행하면 tomacate는 프로젝트 실행 시 클래스 리소스에 액세스할 수 없어 리플렉션이 발생합니다

Tomacate가 Less를 사용하는 이유 새로운 물건보다?

자세한 설명: tomacate가 먼저 생성되어 작성되고 클래스가 나중에 작성되므로 tomcate는 new의 개체가 무엇인지 알 수 없으므로 new를 통해 Tomcate를 호출할 수 없습니다. 그러나 이 역시 새로운 방법을 사용할 수 없으므로 반영이 발생합니다.

Tomcate가 doGet과 doPost 메소드를 호출하려고 할 때, 이 두 메소드는 static이 아니기 때문에 새로운 객체를 통해 호출해야 하는데, tomcate는 객체를 생성할 수 없기 때문에 파일을 얻기 위해 Reflection이 생성됩니다

위 내용은 Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제