이 글은 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!