java 소스 코드------>javac--------------->java 바이트코드 파일------------ ---> ;java------>클래스 객체(메모리 공간: 메타공간, 로컬 메모리)------------ ------ ------new--------->인스턴스화된 객체------gc---- ------- -->객체 언로드
object.getClass() (메모리 단계)
Test.class (메타공간)
class.forName( "클래스 전체 이름: 패키지 이름 + 클래스 이름"): 메모리 공간(하드 디스크)에 들어가지 않고도 객체를 가져올 수 있습니다
예를 들어 jdbc를 사용하여 데이터베이스를 작동할 때 이 클래스가 메모리에 들어가기 전에 , 클래스의 전체 이름(패키지 이름 + 클래스 이름)을 사용할 수 있습니다. 클래스를 호출하고
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 변수 이름
Properties 파일: 콘텐츠는 k=v,
형식의 등호로 연결됩니다. 코드 예:
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에는 자체 주요 메소드가 있습니다
예: tomacate 도구를 사용하여 서블릿을 실행하면 tomacate는 프로젝트 실행 시 클래스 리소스에 액세스할 수 없어 리플렉션이 발생합니다
Tomacate가 Less를 사용하는 이유 새로운 물건보다?
자세한 설명: tomacate가 먼저 생성되어 작성되고 클래스가 나중에 작성되므로 tomcate는 new의 개체가 무엇인지 알 수 없으므로 new를 통해 Tomcate를 호출할 수 없습니다. 그러나 이 역시 새로운 방법을 사용할 수 없으므로 반영이 발생합니다.
Tomcate가 doGet과 doPost 메소드를 호출하려고 할 때, 이 두 메소드는 static이 아니기 때문에 새로운 객체를 통해 호출해야 하는데, tomcate는 객체를 생성할 수 없기 때문에 파일을 얻기 위해 Reflection이 생성됩니다
위 내용은 Java 반사 메커니즘에 대한 지식 포인트는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!