자바 반사 메커니즘에 대해 간단히 이야기하다.

4925 단어
하나의 인스턴스에서 출발 - 런타임 시 객체에 대한 정보 얻기
1. 고객에 대한 정보를 표시하기 위해 Customer 클래스를 먼저 정의합니다.
public 	class Customer {
		private Long id;
		private String name;
		private int age;
		private String phone;
		public Customer() {
			
		}
		public Customer(Long id,String name,int age,String phone) {
			this.id=id;
			this.name=name;
			this.age=age;
			this.phone=phone;
		}
		public final Long getId() {
			return id;
		}
		public void setId(Long id) {
			this.id=id;
		}
		public final String getName() {
			return name;
		}
		public final void setName(String name) {
			this.name=name;
		}
		public final int getAge() {
			return age;
		}
		public void setAge(int age) {
			this.age=age;
		}
		public final String getPhone() {
			return phone;
		}
		public void setAge(String phone) {
			this.phone=phone;
		}
	}

2.이제 Customer 실례의 모든 구조 방법과 일반적인 방법 및 속성 정보를 얻기 위해 클래스를 작성합니다
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionApplication {

	/**
	 * @param args
	 */
	public static void ShowObjectInfo(Object obj) throws Exception {
		Class c=obj.getClass();
		int i;
		System.out.println(obj.toString()+" :");
		Constructor [] cs=c.getConstructors();
		for(i=0;i<cs.length;i++) {
			System.out.println(cs[i].toString());
		}
		
		System.out.println(obj.toString()+" :");
		Method [] methods=c.getDeclaredMethods();
		for(i=0;i<methods.length;i++) {
			System.out.println(methods[i].toString());
		}
		
		System.out.println(obj.toString()+" :");
		Field[] fields=c.getDeclaredFields();
		for(i=0;i<fields.length;i++) {
			System.out.println(fields[i].toString());
		}
	}
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Customer customer=new Customer(001L,"wangzhicheng",28,"13866916216");
		ShowObjectInfo(customer);
	}

}

 3. 실행 결과:
Customer@1fb8ee3 :
public Customer()
public Customer(java.lang.Long,java.lang.String,int,java.lang.String)
Customer@1fb8ee3 :
public void Customer.setId(java.lang.Long)
public final int Customer.getAge()
public void Customer.setAge(int)
public void Customer.setAge(java.lang.String)
public final java.lang.String Customer.getPhone()
public final java.lang.String Customer.getName()
public final java.lang.Long Customer.getId()
public final void Customer.setName(java.lang.String)
Customer@1fb8ee3 :
private java.lang.Long Customer.id
private java.lang.String Customer.name
private int Customer.age
private java.lang.String Customer.phone
private java.lang.String Customer.phone

반사
이상의 실례를 통해 알 수 있듯이 자바 운행 환경에서 임의의 클래스나 대상에 대해 우리는 이 클래스나 대상에 어떤 속성과 방법이 있는지 알 수 있다.뿐만 아니라, 임의의 대상에 대해, 우리는 실행할 때, 그것의 임의의 방법을 호출할 수 있다.이런 동적 접근 클래스의 정보를 얻고 대상을 호출하는 방법은 바로 자바의 반사 기술이다.
3. 왜 반사적인 존재가 있는지--java에서.lang. Class 클래스
자바 프로그램이 실행될 때, 자바가 실행될 때 시스템은 모든 대상에 대해 이른바 실행시 유형 표식을 해 왔다. 이 작업은 모든 대상이 속한 클래스를 기록하고, 이러한 유형의 정보를 저장하는 데 사용되는Class 클래스이다.따라서 Class를 통해 클래스에 대한 정보를 얻을 수 있습니다. 전례와 같습니다.
4반사 기술의 간단한 응용 - 런타임 시 객체 복사
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;


public class CopyObject {

	/**
	 * @param args
	 */
	public  static Object copy(Object source) throws Exception {
		Class<?>c=source.getClass(); // source 
		Object obj=c.newInstance(); // source 
		Field[] fields=c.getDeclaredFields(); // 
		for(int i=0;i<fields.length;i++) {
			Field field=fields[i];
			String fieldName=field.getName(); // 
			String firstLetter=fieldName.substring(0,1).toUpperCase(); // 
			String getMethodName="get"+firstLetter+fieldName.substring(1); // get 
			String setMethodName="set"+firstLetter+fieldName.substring(1); // set 
			Method getMethod=c.getMethod(getMethodName, new Class[]{}); // get 
			Method setMethod=c.getMethod(setMethodName, new Class[]{field.getType()});
			// set , field.getType
			Object value=getMethod.invoke(source, new Object[]{});
			// get 
			System.out.println(fieldName+":"+value);
			setMethod.invoke(obj, new Object[]{value});
			// set 
		}
		return obj;
	}
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Customer customer=new Customer(001L,"wangzhicheng",28,"13866916216");
		Customer customercopy=(Customer)copy(customer);
		System.out.println(" :");
		System.out.println(customercopy.getId()+" "+customercopy.getName()+" "+
		customercopy.getAge()+" "+customercopy.getPhone());
	}
}

실행 결과:
id:1
name:wangzhicheng
age:28
phone:13866916216
 :
1 wangzhicheng 28 13866916216

 
오반사도 부작용이 있어 프로그램의 성능에 영향을 미친다
6 가지 추가 참조: Java Reflection in Action

좋은 웹페이지 즐겨찾기