Reflection은 객체와 클래스가 어떤 것인지 컴파일 타임에 예측이 불가능하고, 프로그램이 실행될 때의 정보를 통해서만 객체와 클래스의 정보를 알 수 있다는 문제를 해결할 수 있습니다. 달리기.
두 사람이 공동으로 개발할 경우 상대방의 클래스명만 알면 예비 개발이 진행됩니다.
Class.forName(String clazzName) 정적 메서드
클래스의 클래스 속성 호출 , Person. 클래스는 Person 클래스 객체를 반환합니다(권장)
객체의 getClass() 메서드 호출
특정 용도 여전히 실제 상황에 따라 선택해야 합니다. 첫 번째 방법은 클래스 이름만 알면 됩니다. 두 번째 및 세 번째 방법은
Connstructor<T> getConstructor(Class<?>...parameterTypes)
: 지정된 형식 매개변수를 사용하여 이 Class 객체의 해당 클래스를 반환합니다. 공용 생성자
Constructor<?>[] getConstructors()
: 이 클래스 객체에 해당하는 클래스의 모든 공용 생성자를 반환합니다.
Constructor<T>[] getDeclaredConstructor(Class<?>...parameterTypes)
: 이 클래스 객체를 반환합니다. 해당 클래스의 지정된 매개변수가 있는 생성자
Constructor<?>[] getDeclaredConstructors()
: 이 클래스 객체의 해당 클래스의 모든 생성자를 반환하고 생성자의 액세스 권한은 관련 없음
Method getMethod(String name,Class<?>...parameterTypes)
: 이 클래스 객체의 해당 클래스의 지정된 형식 매개변수를 사용하여 공용 메소드를 반환합니다
Method[] getMethods()
: 이 클래스 객체가 나타내는 클래스의 모든 공개 메서드를 반환합니다.
Method getDeclaredMethod(string name,Class<?>...parameterTypes)
: 이 클래스 객체에 해당하는 지정된 클래스를 반환합니다. 형식 매개변수의 메소드는 메소드 접근권한과 무관
Method[] getDeclaredMethods()
: 이 클래스 객체의 해당 클래스의 모든 메소드를 반환하며, 메소드와는 아무런 관련이 없다. 접근 권한
Field getField(String name)
: 이 클래스 객체에 해당하는 지정된 이름의 공용 멤버 변수를 반환합니다
Field[] getFields()
: 이 클래스 객체에 해당하는 클래스의 모든 공용 멤버 변수를 반환합니다.
Field getDeclaredField(String name)
: 지정된 멤버 변수를 반환합니다. 멤버 변수 접근 권한에 관계없이 이 클래스 객체에 해당하는 클래스 이름
Field[] getDeclaredFields()
: 접근 권한에 관계없이 이 클래스 객체에 해당하는 클래스의 모든 멤버 변수를 반환합니다. 멤버 변수
<A extends Annotation>A getAnnotation(Class<A>annotationClass)
: 클래스의 해당 클래스에 대한 지정된 유형의 Annotation을 가져옵니다. 유형 주석이 없으면 null
<A extends Annotation>A getDeclaredAnnotation(Class<A>annotationClass)
을 반환합니다. 이는 Java 8의 새로운 기능입니다. 이 메서드는 해당 클래스를 직접 수정하는 지정된 유형의 주석을 가져옵니다. 클래스 객체가 없으면 null
Annotation[] getAnnotations()
을 반환합니다. 수정하는 모든 주석
Annotation[] getDeclaredAnnotations()
을 반환합니다. 이 클래스 객체의 해당 클래스: 이 클래스 객체의 해당 클래스를 수정하는 모든 주석을 반환합니다
<A extends Annotation>A[] getAnnotationByType(Class<A>annotationClass)
: 이 메서드의 기능은 기본적으로 getAnnotation() 메서드와 유사합니다. 앞서 소개했지만 Java8에서는 반복 주석 기능을 추가했기 때문에 클래스를 수정하는 지정된 유형의 여러 주석을 얻으려면 이 방법을 사용해야 합니다
<A extends Annotation>A[] getDeclaredAnnotationByType(Class<A>annotationClass)
: 이 메소드는 앞서 소개한 getDeclaredAnnotations() 메소드와 유사합니다. 이는 Java8의 반복 주석 기능 때문이기도 합니다. 다중 주석
Class<?>[] getDeclaredClasses()
: 이 클래스 구성의 해당 클래스에 포함된 모든 내부 클래스를 반환
Class<?> getDeclaringClass()
: Class 객체의 해당 클래스가 있는 외부 클래스를 반환
Class<?>[] getInterfaces()
: 이 클래스 객체의 해당 클래스에 의해 구현된 모든 인터페이스를 반환합니다
Class<? super T> getSuperclass()
: 해당 클래스의 상위 클래스의 Class 객체를 반환합니다. 이 클래스 객체의
int getModifiers()
: 이 클래스 또는 인터페이스를 반환합니다. 모든 수정자는 public, protected, private, final, static, abstract 등 해당 상수로 구성됩니다. 반환된 정수는 다음 메서드를 사용하여 디코딩해야 합니다. 실제 수정자를 얻기 위한 수정자 도구 클래스
Package getPackage()
: 이 클래스의 패키지를 가져옵니다.
String getName()
: 이 CLAs를 반환합니다. String 형식으로 객체가 표현하는 클래스의 약어
boolean isAnnotation()
: 이 클래스 반환 객체가 주석 유형을 나타내는지 여부
boolean isAnnotationPresent(Class<? extends Annotation>annotationClass)
: 이 클래스 객체가 클래스 주석으로 장식되었는지 확인
boolean isAnonymousClass()
: 이 클래스를 반환합니다. 객체가 익명 클래스
boolean isArray()
인지 여부를 반환합니다. 배열클래스
boolean isEnum()
을 나타냅니다. 이 클래스 객체가 열거형
boolean isInterface()
을 나타내는지 여부를 반환합니다. 이 클래스 객체가 인터페이스를 나타내는지 여부를 반환합니다.
boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target=" _blank">Object<code>boolean isInstance(<a href="http://www.php.cn/wiki/60.html" target="_blank">Object</a> obj)
obj): obj 결정 이 클래스 개체의 인스턴스인지 여부에 관계없이 이 메서드는 operator
operator结果
를 완전히 대체할 수 있습니다.
public interface Colorable { public void value(); }
int getParameterCount()
Parameter[] getParameters()
getModifiers()
String getName()
Type getParameterizedType()
Class<?>getType()
boolean isNamePresent()
boolean isVarArgs()
结果
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class<Colorable> cls=Colorable.class; System.out.println(cls.getMethod("value")); System.out.println(cls.isAnnotation()); System.out.println(cls.isInterface()); } }
public abstract void com.em.Colorable.value() false true
public class Test { public void getInfo(String str,List<String>list){ System.out.println("成功"); } }
먼저 Class 개체를 사용하여 지정된 Constructor 개체를 얻은 다음 Constructor 개체를 호출합니다. newInstance() 메서드를 사용하여 Class 개체의 해당 클래스 인스턴스를 만듭니다.
Object invoke(Object obj,Object...args)
: 이 메서드의 obj는 메서드를 실행하기 위한 기본 호출이며, 다음 인수는 다음과 같은 경우 메서드에 전달되는 실제 매개 변수입니다. 메소드 실행
public class ClassInfo { public static void main(String[] args) throws NoSuchMethodException, SecurityException { Class<Test> cls=Test.class; Method med=cls.getMethod("getInfo", String.class,List.class); System.out.println(med.getParameterCount()); Parameter[] params=med.getParameters(); System.out.println(params.length); for(Parameter par:params){ System.out.println(par.getName()); System.out.println(par.getType()); System.out.println(par.getParameterizedType()); } } }
2 2 arg0 class java.lang.String class java.lang.String arg1 interface java.util.List java.util.List<java.lang.String>
结果
public class Test { public Test(String str) { System.out.println(str); } public void getInfo(String str){ System.out.println(str); } }
다음 공식을 볼까요 아래 밤나무를 잘 보세요
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); Method med=cls.getMethod("getInfo", String.class); med.invoke(test, "调用方法成功"); } }
初始化 调用方法成功
结果
public class Test { public Test(String str) { System.out.println(str); } //私有方法 private void getInfo(String str){ System.out.println(str); } }
setAccessible(boolean flag): 값을 true로 설정하여 이 메소드 검사
getXxx(Object obj)
: obj 객체의 멤버 변수 값을 가져옵니다. 여기서 Xxx는 8가지 기본 유형에 해당합니다. 멤버 변수의 유형이 참조 유형인 경우 Xxx 부분
setXxx(Object obj,Xxx val)
을 제거합니다. obj 객체를 변경합니다. 멤버 변수는 val 값으로 설정됩니다. 여기서 Xxx는 8가지 기본타입에 해당합니다. 멤버변수의 타입이 참조타입이라면 set
후 Xxx를 취소하면 됩니다. 개인 멤버 변수를 포함한 변수
public class ClassInfo { public static void main(String[] args) throws Exception { Class<Test> cls=Test.class; Constructor<Test>construct=cls.getConstructor(String.class); Test test=construct.newInstance("初始化"); //为啥使用这个方法呢? Method med=cls.getDeclaredMethod("getInfo", String.class); //为啥使用这个方法呢? med.setAccessible(true); med.invoke(test, "调用方法成功"); } }
初始化 调用方法成功
结果
public class Test { private int num; public Test(String str) { System.out.println(str); } private void getInfo(String str){ System.out.println(str); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
java.lang.reflect 패키지 아래에 Array 클래스가 있습니다. 동적으로 배열을 생성할 수 있는
static Object newInstance(Class<?>componentType,int...length)
: 지정된 요소 유형과 지정된 크기로 새 배열을 생성합니다
static xxx getXxx(Object array,int index)
:返回array数组中第index个元素。其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为get()
static void setXxx(Object array,int index,xxx val)
:将array数组中低index 个元素的值设为val,其中xxx是各种基本数据类型,如果数组元素是引用类型,则该方法变为set()
public class ArrayInfo { public static void main(String[] args) { Object arrays=Array.newInstance(String.class, 3); Array.set(arrays, 0, "第一个"); Array.set(arrays, 1, "第二个"); Array.set(arrays, 2, "第三个"); System.out.println(Array.get(arrays, 2)); } }
위 내용은 클래스 및 객체 정보를 얻기 위한 Java 리플렉션에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!