>Java >java지도 시간 >Java의 반사 메커니즘 예제에 대한 자세한 설명

Java의 반사 메커니즘 예제에 대한 자세한 설명

怪我咯
怪我咯원래의
2017-07-02 10:20:421356검색

이 글은 주로 Java의 Reflection 메커니즘에 대한 자세한 설명을 소개하고 있습니다.

Java의 Reflection 메커니즘에 대한 자세한 설명은

Reflection에서 자주 들었습니다. Design Pattern에서도 사용하셨을 텐데, 이번에 다시 배워서 보니까 좀 이해가 안 되시는 것 같아요. 좋아요!

먼저 리플렉션의 개념을 살펴보겠습니다.

주로 프로그램이 자신의 상태나 동작에 액세스하고 이를 감지 및 수정하고 상태 및 상태에 따라 애플리케이션을 조정하거나 수정할 수 있는 능력을 말합니다. 자체 동작의 결과 동작의 상태 및 관련 의미를 설명합니다.

Reflection은 구성 요소 간 소스 코드 링크 없이도 런타임 시 조립할 수 있는 유연한 코드를 쉽게 생성할 수 있는 강력한 Java 도구입니다. 그러나 리플렉션을 부적절하게 사용하면 비용이 많이 들 수 있습니다!

개념이 헷갈린다면 계속 읽어보세요.

두 번째, 반사 메커니즘의 역할:

1, 디컴파일: .class-->.java

2, 반사를 통해 Java 객체의 속성, 메서드, 구성 메서드 등에 액세스합니다.

이렇게 하면 이해하기 더 쉬울 것 같습니다. 이러한 기능을 자세히 구현하는 방법을 살펴보겠습니다.

셋, sun이 제공하는 리플렉션 메커니즘의 클래스를 살펴보겠습니다.

java.lang.Class;        

java.lang.reflect.Constructor; java.lang.reflect.Field;    

java.lang.reflect.Method;

java.lang.reflect.Modifier;

우리는 이 네 가지 클래스에서 리플렉션을 통해 다양한 메서드, 속성 및 기타 작업을 쿼리할 수 있습니다. 아니면 API에 지속적으로 쿼리하는 방법을 배워야 할까요? 이것이 바로 우리의 최고의 선생님입니다.

네 번째, 특정 기능 구현:

1. 리플렉션 메커니즘을 통해 클래스를 얻는 방법에는 세 가지가 있습니다. Employee 유형을 가져오겠습니다.

객체 만들기

: 클래스를 얻은 후 객체 생성 및 newInstance 사용:

//第一种方式:
Classc1 = Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class;
 
//第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employeee = new Employee();
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
3. 속성 가져오기: 모든 속성과 지정된 속성으로 구분:

a, 먼저 모든 속성을 가져오는 방법 살펴보기:

   Class c =Class.forName("Employee");
 
      //创建此Class 对象所表示的类的一个新实例
      Objecto = c.newInstance(); //调用了Employee的无参数构造方法.

b. 특정 속성 가져오기, 기존 속성과 비교하여 학습 방법:

//获取整个类
  Class c = Class.forName("java.lang.Integer");
    //获取所有的属性?
  Field[] fs = c.getDeclaredFields();
 
        //定义可变长的字符串,用来存储属性
  StringBuffer sb = new StringBuffer();
     //通过追加的方法,将每个属性拼接到此字符串中
  //最外边的public定义
  sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
     //里边的每一个属性
  for(Field field:fs){
  sb.append("\t");//空格
  sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等
  sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字
  sb.append(field.getName()+";\n");//属性的名字+回车
  }
 
  sb.append("}");
 
  System.out.println(sb);

4. 획득 방법과 구성 방법은 자세히 설명하지 않습니다. 키워드만 보면 됩니다.

이렇게 하면 클래스의 다양한 콘텐츠를 얻을 수 있고 디컴파일할 수 있습니다. 먼저 컴파일한 다음 실행하는 JAVA와 같은 언어의 경우 리플렉션 메커니즘을 사용하면 코드를 더 유연하고 쉽게

객체 지향

으로 구현할 수 있습니다.

다섯째, 리플렉션 플러스

구성 파일을 사용하면 프로그램이 더욱 유연해집니다. 디자인 패턴 학습에서 추상 팩토리 학습 시 데이터베이스 링크 문자열 등을 더 편리하게 읽을 수 있도록 리플렉션을 사용했습니다. 잘 이해가 안가서 그냥 복사했습니다. .NET에서 리플렉션 + 구성 파일의 사용을 살펴보세요:

당시 사용된 구성 파일은 app.config 파일이었고 내용은 XML 형식이었고 링크된 데이터베이스의 내용이 채워져 있었습니다:

public static void main(String[] args) throws Exception{
  
<span style="white-space:pre"> </span>//以前的方式:
 /*
 User u = new User();
 u.age = 12; //set
 System.out.println(u.age); //get
 */
  
 //获取类
 Class c = Class.forName("User");
 //获取id属性
 Field idF = c.getDeclaredField("id");
 //实例化这个类赋给o
 Object o = c.newInstance();
 //打破封装
 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
 //给o对象的id属性赋值"110"
 idF.set(o, "110"); //set
 //get
 System.out.println(idF.get(o));
}

reflection 작성 방법:

   <configuration>
  <appSettings>
  <add   key="" value=""/>
  </appSettings>
      </configuration>

이 방법의 장점은 데이터베이스 변경이 매우 쉽다는 것입니다. 예를 들어 시스템 데이터베이스를 SQL Server에서 Oracle로 업그레이드하면 두 개의 D 레이어를 작성합니다. 구성 파일의 내용을 변경하거나 조건을 추가하여 선택하면 매우 편리합니다.

물론, 여기의 구성 파일이 속성 파일이라고 불리는 .properties라는 점을 제외하면 JAVA에서도 마찬가지입니다. 반성을 통해 내부 내용을 읽어보세요. 이런 방식으로 코드는 고정되지만 구성 파일의 내용을 변경할 수 있으므로 코드가 훨씬 더 유연해집니다!

결론적으로 JAVA 리플렉션을 다시 학습하고 이를 유연하게 사용하면 코드가 더 유연해 질 수 있지만 단점도 있습니다. 즉, 이를 사용하면 성능이 저하되고 소프트웨어의 복잡성이 증가하므로 여전히 그렇습니다. 우리는 그것을 주의 깊게 사용해야 합니다.

위 내용은 Java의 반사 메커니즘 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.