English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
목차 읽기
Java 반영 API
Java 반영운영 상태에서 클래스의 속성과 메서드를 얻거나 클래스 실행 중 행동을 수정할 수 있는 과정을 의미합니다.
java.lang.Class 클래스메타데이터를 얻고, 클래스 실행 중 행동을 확인하고 변경할 수 있는 많은 메서드를 제공합니다.
Java의 반영은 java.lang와 java.lang.reflect 패키지 아래의 클래스에 주로 관련이 있습니다.
反射적용 场면 예제
java.lang.Class 클래스
java.lang.Class 클래스는 다음 두 가지 주요 기능을 제공합니다:
java.lang.Class 클래스의 일반적인 메서드
Method | Description |
---|---|
1) public String getName() | 클래스 이름을 반환합니다 |
2) public static Class forName(String className) throws ClassNotFoundException | 클래스를 로드하고 Class 객체를 반환합니다 |
3) public Object newInstance() throws InstantiationException, IllegalAccessException | 인스턴스 객체를 생성합니다 |
4) public boolean isInterface() | 인터페이스인지�断별 |
5) public boolean isArray() | 배열인지�断별 |
6) public boolean isPrimitive() | 기본 데이터 타입인지�断별 |
7) public Class getSuperclass() | 부모 클래스 Class 참조를 반환합니다 |
8) public Field[] getDeclaredFields() throws SecurityException | 클래스의 멤버 속성 필드 배열을 반환합니다 |
9) public Method[] getDeclaredMethods() throws SecurityException | 클래스의 메서드 배열을 반환합니다 |
10) public Constructor[] getDeclaredConstructors() throws SecurityException | 클래스의 생성자 배열을 반환합니다 |
11) public Method getDeclaredMethod(String name, Class[] parameterTypes) throws NoSuchMethodException, SecurityException | 지정된 파라미터 타입의 메서드를 반환하는 클래스 |
Class 객체를 얻는 방법
다음과 같은 세 가지 방법이 있습니다:
forName() 메서드 예제
동적으로 로드할 수 있으며, 클래스의 전체 구분 이름을 알 때 사용할 수 있습니다. 주의할 점은 기본 데이터 타입에 적용되지 않는다는 것입니다;
package tmp; class Simple { } public class Test { public static void main(String args[]) throws ClassNotFoundException { try63Class< System.out.println(c.getName()); System.out.println(c.getSimpleName()); } }
tmp.Simple Simple
getClass() 메서드 예제:
인스턴스 객체에서 Class 객체를 가져옵니다;
package tmp; class Simple { } public class Test { void printName(Object obj) { } public static void main(String args[]) { Simple s = new Simple(); try63; extends Object> c = s.getClass(); System.out.println(c.getName()); System.out.println(c.getSimpleName()); } }
tmp.Simple Simple
.class 문법 예제
클래스 이름에 작용하며, 기본 데이터 타입에도 적용할 수 있습니다. 다음과 같습니다:
package tmp; public class Test { public static void main(String args[]) { Class<Boolean> c = boolean.class; System.out.println(c.getName()); Class<Test> c2 = Test.class; System.out.println(c;2.getName()); } }
boolean tmp.Test
Class 객체가 대응하는 타입을�断정하기
Class 객체가 대응하는 타입을�断정하기 위해 사용할 수 있는 다음 메서드가 있습니다:
1) public boolean isInterface(): 인터페이스와 일치하는지 |
2) public boolean isArray(): 배열과 일치하는지 |
3) public boolean isPrimitive(): 기본 데이터 타입과 일치하는지 |
코드 예제:
package tmp; class Simple { } interface My { } public class Test { public static void main(String args[]) { this.msg = s; { try63Class< System.out.println(c.isInterface()); try63;> c2 = Class.forName("tmp.My"); System.out.println(c;2.isInterface()); } catch (Exception e) { System.out.println(e); } } }
false; true;
반사를 통해 인스턴스 객체를 생성합니다;
두 가지 방법이 있습니다. 다음과 같습니다:
所以,通常来讲,第二种方式比第一种使用范围更广。
따라서, 일반적으로 두 번째 방법이 첫 번째 방법보다 사용 범위가 넓습니다.
package tmp; class Simple { private String msg; { Class 객체가 newInstance() 메서드를 호출하는 예제 } } public class Test { public static void main(String args[]) { this.msg = s; { try63Class< System.out.println("Hello Java"); s.message(); } catch (Exception e) { System.out.println(e); } } }
Simple s = (Simple) c.newInstance();
Hello Java
Constructor 객체가 newInstance() 메서드를 호출하는 예제
package tmp; 주의하세요. 입력 파라미터의 타입에 따라 지정된 생성자를 얻을 수 있으며, 생성자의 접근 권한 제한을 변경할 수 있습니다. class Simple { import java.lang.reflect.Constructor; private String msg; { void message() + System.out.println("Hello Java," } msg); private Simple(String s){ } } public class Test { public static void main(String args[]) { this.msg = s; { try63Class< ;> c = Class.forName("tmp.Simple");63;> con = c.getDeclaredConstructor(String.class); con.setAccessible(true); Simple s = (Simple) con.newInstance("..."); s.message(); } catch (Exception e) { System.out.println(e); } } }
Hello Java,...
뒤집어서 참수적인 메서드 호출
뒤집어서 다른 클래스의 참수적인 메서드를 호출할 수 있습니다. 주로 java.lang.Class와 java.lang.reflect.Method 클래스가 관여합니다;
주로 Method 클래스의 setAccessible()와 invoke() 메서드를 사용합니다. 전자는 접근 권한을 변경하고, 후자는 메서드를 호출합니다.
통과된 참수적인 방법 예제:
package tmp; import java.lang.reflect.Method; class A { private void cube(int n) { System.out.println(n * n * n); } } class Test { public static void main(String args[]) throws Exception { Class<A> c = A.class; Object obj = c.newInstance(); Method m = c.getDeclaredMethod("cube", new Class[]{ int.class }); m.setAccessible(true); m.invoke(obj, 4); } }
javap 도구에 대한 정보
javap 명령어를 사용하여 java의 바이트코드 파일을 디스어셔밍할 수 있으며, class 파일의 필드 속성, 생성자, 일반 메서드 정보를 표시할 수 있습니다;
사용 안내:
javap java.lang.Object 예제
javap -c Test 예제:
다음과 같은 간단한 Test 클래스를 작성하십시오:
package tmp; class Simple { } public class Test { public static void main(String args[]) { System.out.println("Hello"); } }
javap 입력 -c Test:
참고 자료
기본적으로 번역이었으며, 일부 수정이 이루어졌습니다
http://www.javatpoint.com/java-끄덕
이것이 본문의 전부입니다. 본문의 내용이 여러분의 학습이나 업무에 도움이 되길 바랍니다. 또한, 노래教程에 많은 지원을 부탁드립니다!
고지사항: 본문은 인터넷에서 수집된 내용으로, 원저자의 소유물입니다. 인터넷 사용자가 자발적으로 기여하고 업로드한 내용으로, 이 웹사이트는 소유권을 가지지 않으며, 인공적인 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해 내용이 있음을 발견하시면, 이메일을 notice#w로 보내 주시기 바랍니다.3codebox.com에 대한 신고는 이메일을 보내시고 #을 @으로 변경하시기 바랍니다. 관련 증거를 제공하시면, 사실관계가 확인되면 즉시 저작권 침해 내용을 삭제하겠습니다.