反射概述

什么是反射?

在程序的运行过程中动态的获取类的方法和属性。

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念, 
    静态编译:在编译时确定类型,绑定对象,即通过。 
    动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 
    态的应用,有以降低类之间的藕合性。 
    一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中 
    它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编 
    译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如 
    这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能 
    的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功 
    能。 
       它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 
    满足我们的要求。这类操作总是慢于只直接执行相同的操作。 


package com.wxh.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;

public class Demo {

	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException {
		
		//获取类的class对象的三种方式
		
		//第一种方式
		Class clz=People.class;
		
		//第二种方式
		People p=new People();
		Class clz2=p.getClass();
		
		//第三种方式
		Class clz3=Class.forName("com.wxh.reflect.People");
		
		//通过class对象创建类的实例
		Object obj=clz3.newInstance();
		
		
		//拿到类的所有属性
		Field[] fs=clz3.getDeclaredFields();		
		for (Field f : fs) {
			System.out.println("属性名:"+f.getName());
			System.out.println("属性的类型:"+f.getType());
		}
		
		
		//拿到类的所有方法
		Method[] ms=clz3.getDeclaredMethods();
		for (Method m : ms) {
			System.out.println("方法:"+m);
			System.out.println("方法的返回类型:"+m.getReturnType());
						
			if("sayHello".equals(m.getName())){
				//执行某个方法
				m.invoke(obj);
			}		
		}
		//拿到类的构造器
		Constructor[] cs=clz3.getDeclaredConstructors();
		for (Constructor constructor : cs) {
			System.out.println("构造器:"+constructor);
		}
		
		//获取某一个指定的方法对象
		Method method=clz3.getMethod("sayHello");
		Object o=method.invoke(obj);
		System.out.println("方法的返回值:"+o);			
	}
}

package com.wxh.reflect;

import java.util.Date;

public class People {
	private int pid;
	private String name;
	String phone;
	private double weight;
	private Date birthday;
	
	
	public People() {
		
	}
	
	
	public int getPid() {
		return pid;
	}
	public void setPid(int pid) {
		this.pid = pid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}	
	
	public String sayHello(){
		System.out.println("hello");
		return "hello";
	}

	@Override
	public String toString() {
		return "People [birthday=" + birthday + ", name=" + name + ", phone="
				+ phone + ", pid=" + pid + ", weight=" + weight + "]";
	}
	
}




你可能感兴趣的:(反射)