>  기사  >  Java  >  Java의 반사 메커니즘에 대한 샘플 코드 공유(그림)

Java의 반사 메커니즘에 대한 샘플 코드 공유(그림)

黄舟
黄舟원래의
2017-06-18 10:08:051232검색

이 글은 주로 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 유형을 가져옵니다.

객체 만들기

2. , 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));
}

리플렉션 작성 방법:


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

장점은 데이터베이스를 변경하는 것이 매우 쉽다는 것입니다. 예를 들어 시스템 데이터베이스를 SQL Server에서 Oracle로 업그레이드하면 두 가지를 작성합니다. D 레이어, 구성 파일의 내용 변경, 조건 선택 추가 등 단 한 번의 클릭만으로 매우 편리합니다.

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

위 내용은 Java의 반사 메커니즘에 대한 샘플 코드 공유(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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