자바 의 반사 응용 실현
우 리 는 먼저 Student 클래스 를 만 들 었 다.클래스 의 구성원 변수,구조 방법,구성원 방법 공공 또는 사유 에 주의 하 십시오.
package com.reflect;
public class Student {
//
public String name;//
private int age;//
//
public Student() {
super();
// TODO Auto-generated constructor stub
}
//
private Student(String name) {
this.name = name;
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
// (getXxx/setXxx)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//
public void study() {
System.out.println(" java!");
}
//
private void study(String string) {
System.out.println(" "+string);
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
반사 개술1.반사:반 사 는 class 파일 대상 을 통 해 파일 대상 의 구성원 방법,구조 방법,구성원 변 수 를 사용 하 는 것 이다.
이전에 우리 가 대상 을 사용 하 는 방법 을 회상 할 때 는 반드시 new 대상 을 통 해 사용 해 야 한다.new Student().study(),이때 우 리 는 문 제 를 발견 했다.작은 사례 에서 우 리 는 Student 류 에 study()방법 이 있다 는 것 을 알 고 있 을 것 이다.만약 에 우리 가 이런 종 류 를 사용 하고 싶 지만 유형 중의 정 보 를 잘 모 르 면 이때 반사 가 일정한 역할 을 한다.
사실 반사 작용 은 이 뿐만 이 아니다.아래 와 같다
2.반 사 는 프로그램의 유연성 과 확장 성 을 향상 시 키 고 결합 성 을 낮 추 며 자가 적응 능력 을 향상 시 킬 수 있다.프로그램 이 모든 종류의 대상 을 만 들 고 제어 할 수 있 도록 합 니 다.하 드 코딩 목표 클래스 를 향상 시 킬 필요 가 없습니다.
자바 반사 기술 응용 분야 가 매우 넓 고 후기 에 소프트웨어 테스트,자바 빈 등 이 모두 중요 한 역할 을 한다.
많은 유행 하 는 오픈 소스 프레임 워 크,예 를 들 어 Struts,Hibernate,Spring 은 실현 과정 에서 이 기술 을 사용 했다.
3.성능 문제:반 사 를 사용 하 는 것 은 기본적으로 해석 작업 으로 필드 와 방법 으로 접속 할 때 직접 코드 보다 훨씬 느리다.따라서 자바 반사 체 제 는 옳 은 것 에 만 적용 된다.유연성 과 확장 성 요구 가 높 은 시스템 구조 에서 일반 프로그램 은 반사 사용 을 권장 하지 않 고 프로그램 내부 논 리 를 모호 하 게 할 수 있다.프로그래머 는 코드 에서 프로그램의 논리,반사 등 소스 코드 를 돌아 가 는 기술 을 보고 싶 어서 유지 문 제 를 가 져 올 수 있다.
반사 클래스 대상 가 져 오기
4
package com.reflect;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
// 1
Student p = new Student();
Class c = p.getClass();
Student p2 = new Student();
Class c2 = p2.getClass();
System.out.println(p == p2);// false Student
System.out.println(c == c2);// true class
// 2
Class c3 = Student.class;
System.out.println(c == c3);//true class
// 3
// ClassNotFoundException( )
Class c4 = Class.forName("com.reflect.Student");
System.out.println(c == c4);//true class
}
}
Class 클래스 와 관련 된 몇 가지 클래스멤버 변수 와 관련 된 Field구조 방법 과 관계 가 있다. Constructor 멤버 방법 Method 4.567917.관련 된 몇 가지 방법
먼저 몇 가지 방법 을 알 아 보 겠 습 니 다.
public Constructor getConstructor()//
public Constructor[] getConstructors()//
public Constructor[] getDeclaredConstructors()//
public Constructor getDeclaredConstructor()//
public Constructor<T> getConstructor(Class<?>... parameterTypes)// : class
public void setAccessible(boolean flag)// true Java 。
package com.reflect;
import java.lang.reflect.Constructor;
public class ConstructorDemo {
public static void main(String[] args) throws Exception {
//
Class c = Class.forName("com.reflect.Student");
//
Constructor[] cons = c.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
//
Constructor con = c.getConstructor();//
Constructor con1 = c.getConstructor(String.class, int.class);//
Constructor con2 = c.getDeclaredConstructor(String.class);
//
Object obj = con.newInstance();
Object obj1=con1.newInstance(" ",12);
//
con2.setAccessible(true);// true Java 。
Object obj2 = con2.newInstance(" ");
System.out.println(obj.toString());
System.out.println(obj1.toString());
System.out.println(obj2.toString());
}
}
실행 결과:멤버 변수 반사 가 져 오기
**위의 Constructor 클래스 의 방법 과 유사 합 니 다.이 클래스 도 같은 방법 이 있 습 니 다.모든 구성원 변 수 를 가 져 옵 니 다(배열 로 돌아 갑 니 다).개인 구성원 변 수 를 가 져 오 는 등 여기 서 더 이상 군말 하지 않 습 니 다**
package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/*
*
*/
public class FieldDemo {
public static void main(String[] args) throws Exception {
//
Class c = Class.forName("com.reflect.Student");
//
Field[] fields = c.getFields();
Field[] fields1 = c.getDeclaredFields();
for (Field field : fields1) {
System.out.println(field);
}
/*
* Person p = new Person(); p.address = " "; System.out.println(p);
*/
//
Constructor con = c.getConstructor();
Object obj = con.newInstance();
System.out.println(obj);
//
//
Field nameField = c.getField("name");
// public void set(Object obj,Object value)
// Field 。
nameField.set(obj, " "); // obj addressField " "
System.out.println(obj);
// age
// NoSuchFieldException
Field ageField = c.getDeclaredField("age");
// IllegalAccessException
ageField.setAccessible(true);
ageField.set(obj, 18);
System.out.println(obj);
}
}
실행 결과:반사 획득 멤버 방법
**위의 Constructor 클래스 의 방법 과 유사 합 니 다.이 클래스 도 같은 방법 이 있 습 니 다.모든 구성원 을 얻 는 방법(배열 로 돌아 가기),개인 구성원 을 얻 는 방법 등 여기 서 더 이상 군말 하지 않 습 니 다**
package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class MethodDemo {
public static void main(String[] args) throws Exception {
//
Class c = Class.forName("com.reflect.Student");
//
Method[] methods = c.getMethods(); //
Method[] methods1 = c.getDeclaredMethods(); //
for (Method method : methods1) {
System.out.println(method);
}
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//
// public void show()
// public Method getMethod(String name,Class<?>... parameterTypes)
// , class
Method m1 = c.getMethod("study");
// public Object invoke(Object obj,Object... args)
// Object , ,
m1.invoke(obj); // obj m1
System.out.println("----------");
Method m2 = c.getDeclaredMethod("study", String.class);
// NoSuchMethodException
m2.setAccessible(true);
m2.invoke(obj, " ");
}
}
실행 결과:이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.