English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

java에서 반영자 설명

목차 읽기

  1. Java 반영 API
  2. 반사를 통해 인스턴스 객체를 생성합니다;
  3. 뒤집어서 참수적인 메서드 호출
  4. javap 도구에 대한 정보
  5. 참고 자료

Java 반영 API

Java 반영운영 상태에서 클래스의 속성과 메서드를 얻거나 클래스 실행 중 행동을 수정할 수 있는 과정을 의미합니다.

java.lang.Class 클래스메타데이터를 얻고, 클래스 실행 중 행동을 확인하고 변경할 수 있는 많은 메서드를 제공합니다.

Java의 반영은 java.lang와 java.lang.reflect 패키지 아래의 클래스에 주로 관련이 있습니다.

反射적용 场면 예제

  1. IDE, 예를 들어 Eclipse, MyEclipse, NetBeans 등;
  2. 디버거;
  3. 테스트 도구 등;
  4. 여러 프레임워크, spring, hibernate 등;

java.lang.Class 클래스

java.lang.Class 클래스는 다음 두 가지 주요 기능을 제공합니다:

  1. 실행 중인 클래스의 메타데이터에 접근하는 메서드를 제공합니다;
  2. 클래스의 실행 시간 동작을 확인하고 수정하는 메서드를 제공합니다;

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 객체를 얻는 방법

다음과 같은 세 가지 방법이 있습니다:

  1. Class 클래스의 forName() 메서드는 동적으로 로드되고, 실행 중에 시작하여 클래스를 로드하고 클래스의 정적 초기화를 수행합니다.
  2. 객체의 getClass() 메서드, 정적 로드(编译시에 로드됨)
  3. .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;

반사를 통해 인스턴스 객체를 생성합니다;

두 가지 방법이 있습니다. 다음과 같습니다:

  1. Class 객체의 newInstance() 메서드를 통해 생성됩니다. 이 방식은 무파라미터 생성자를 호출할 수만 있습니다;
  2. Constructor 객체의 newInstance() 메서드를 통해 생성됩니다. 이 방식은 파라미터가 있는 생성자에 적합하며, 싱글턴 패턴을 깨고 프라이빗 생성자를 호출할 수 있습니다;

所以,通常来讲,第二种方式比第一种使用范围更广。

따라서, 일반적으로 두 번째 방법이 첫 번째 방법보다 사용 범위가 넓습니다.

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에 대한 신고는 이메일을 보내시고 #을 @으로 변경하시기 바랍니다. 관련 증거를 제공하시면, 사실관계가 확인되면 즉시 저작권 침해 내용을 삭제하겠습니다.