什么是反射?
在程序的运行过程中动态的获取类的方法和属性。
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了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 + "]";
}
}