>  기사  >  Java  >  JAVA의 반사 메커니즘

JAVA의 반사 메커니즘

高洛峰
高洛峰원래의
2016-12-12 11:40:471211검색

반성, 어떤 정보를 읽었고 디자인 패턴에 활용했을 수도 있다는 말을 자주 들었는데, 이에 대한 깊은 이해가 부족하다는 느낌을 이번에 다시 배웠습니다. 괜찮다고 생각해!


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

주로 자체 상태에 액세스하고 감지하고 수정하는 프로그램의 기능을 나타냅니다. 또는 동작. 자체 동작의 상태 및 결과를 기반으로 애플리케이션에서 설명하는 동작의 상태 및 관련 의미를 조정하거나 수정할 수 있습니다.

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

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

2. 반사 메커니즘의 역할:

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

2. 반사 메커니즘 자바 객체의 속성, 메소드, 생성 방법 등

이러한 기능을 구현하는 방법을 자세히 살펴보겠습니다.


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

java.lang.Class 🎜>java. lang.reflect.Constructor; java.lang.reflect.Field; 🎜>

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

넷째, 특정 기능 구현:

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

2. 객체 생성: 클래스를 가져온 후 newInstance를 사용하여 해당 객체를 생성합니다.

3. 속성 가져오기: 모든 속성과 지정된 속성으로 구분:

a, 먼저 모든 속성을 가져오는 방법을 살펴보세요.

//第一种方式:  
Classc1 = Class.forName("Employee");  
//第二种方式:  
//java中每个类型都有class 属性.  
Classc2 = Employee.class;  
   
//第三种方式:  
//java语言中任何一个java对象都有getClass 方法  
Employeee = new Employee();  
Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)

b. 특정 속성을 가져오고 기존 방법과 비교하여 학습합니다.

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

4. 메서드 가져오기 및 구조 메소드는 자세히 설명하지 않으며 키워드만 살펴보십시오.

//获取整个类  
            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);

이러한 방식으로 클래스의 다양한 컨텐츠를 얻고 디컴파일할 수 있습니다. 먼저 컴파일한 다음 실행하는 JAVA와 같은 언어의 경우 리플렉션 메커니즘을 통해 코드를 더욱 유연하고 객체 지향적으로 구현하기 쉽게 만들 수 있습니다.

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));  
}

JAVA의 반사 메커니즘 다섯째, 리플렉션과 구성 파일은 우리 프로그램을 더욱 유연하게 만들어줍니다.

디자인 패턴을 배울 때, 추상 팩토리를 배울 때 Reflection을 더 많이 사용했습니다. 데이터베이스 연결 문자열 등을 편리하게 읽을 수 있습니다. 당시에는 잘 이해가 되지 않아 그냥 복사해 두었습니다. .NET에서 리플렉션 + 구성 파일의 사용을 살펴보세요:

당시 사용된 구성 파일은 app.config 파일이었고 내용은 XML 형식이었고 링크된 데이터베이스의 내용은 작성:

리플렉션 작성 방법:

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

물론 Java에서도 마찬가지지만 여기서 구성 파일은 속성 파일이라고 불리는 .properties입니다. 반성을 통해 내부의 내용을 읽어보세요. 이런 방식으로 코드는 고정되지만 구성 파일의 내용을 변경할 수 있으므로 코드가 훨씬 더 유연해집니다!
      <configuration>  
lt;appSettings>  
<add     key=""  value=""/>  
lt;/appSettings>  
        </configuration>

assembly.load("当前程序集的名称").CreateInstance("当前命名空间名称".要实例化的类名);

요약하자면, JAVA 리플렉션을 다시 학습하고 유연하게 사용하면 코드가 더 유연해질 수 있지만 단점도 있습니다. 즉, 이를 사용하면 소프트웨어 성능이 저하되고 복잡성이 증가하므로 조심스럽게 말이죠.


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