你的位置:首页 > Java教程

[Java教程]重学JAVA基础(二):Java反射


    看一下百度的解释:
 
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息    以及动态调用对象的方法的功能称为java语言的反射机制。
   先看一下一个例子:
  这是最简单的反射使用方法,通过反射来调用类的方法。

  下面通过一个需求来做反射实验:有3种人类(黄,白,黑),分别继承于Human类,都有人类的共同操作Behaviour
/** * 行为,区别于动物 * @author tomsnail * @date 2015年4月1日 上午10:10:42 */public interface Behaviour{  public void eat();  public void sleep();  public void think();  public void sport();  public void work();}

import java.util.Random;/** * 皮肤类型 * @author tomsnail * @date 2015年4月1日 上午11:41:33 */public enum SkinType{  yellow,white,black;    public static SkinType getSkinType(){        int r = new Random().nextInt(3);        switch(r){      case 0:return SkinType.yellow;      case 1:return SkinType.white;      default:return SkinType.black;    }  }}

public abstract class Human implements Behaviour{        private String name;  private short age;  private short sex;  private SkinType skin;  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public short getAge() {    return age;  }  public void setAge(short age) {    this.age = age;  }  public short getSex() {    return sex;  }  public void setSex(short sex) {    this.sex = sex;  }  public SkinType getSkin() {    return skin;  }  public void setSkin(SkinType skin) {    this.skin = skin;  }  /**   * 构造方法要传皮肤颜色,以区分不同的人种   * @author tomsnail   * @date 2015年4月1日 上午10:06:48   */  public Human(SkinType skin) {    this.skin = skin;    this.name = skin.toString()+"_"+Goddess.counter++;  }}

public class WhiteHuman extends Human{  public WhiteHuman() {    super(SkinType.white);  }    public WhiteHuman(SkinType skinType) {    super(skinType);    System.err.println("我是白人,我在");  }  @Override  public void eat() {    System.err.println("我是白人,我在eat");  }  @Override  public void sleep() {    System.err.println("我是白人,我在sleep");  }  @Override  public void think() {    System.err.println("我是白人,我在think");  }  @Override  public void sport() {    System.err.println("我是白人,我在sport");  }  @Override  public void work() {    System.err.println("我是白人,我在work");  }  private void selfMethod(){    System.out.println("这是白人私有方法");  }}

public class YellowHuman extends Human{  public YellowHuman() {    super(SkinType.yellow);  }    public YellowHuman(SkinType skinType) {    super(skinType);    System.err.println("我是黄种人,我的皮肤颜色是:"+skinType);  }  @Override  public void eat() {    System.err.println("我是黄种人,我在eat");  }  @Override  public void sleep() {    System.err.println("我是黄种人,我在sleep");  }  @Override  public void think() {    System.err.println("我是黄种人,我在think");  }  @Override  public void sport() {    System.err.println("我是黄种人,我在sport");  }  @Override  public void work() {    System.err.println("我是黄种人,我在work");  }    private void selfMethod(){    System.out.println("这是黄种人私有方法");  }}

public class BlackHuman extends Human{      public BlackHuman() {    super(SkinType.black);  }    public BlackHuman(SkinType skinType) {    super(skinType);    System.err.println("我是黑人,我的皮肤颜色是:"+skinType);  }  @Override  public void eat() {    System.err.println("我是黑人,我在eat");  }  @Override  public void sleep() {    System.err.println("我是黑人,我在sleep");  }  @Override  public void think() {    System.err.println("我是黑人,我在think");  }  @Override  public void sport() {    System.err.println("我是黑人,我在sport");  }  @Override  public void work() {    System.err.println("我是黑人,我在work");  }    private void selfMethod(){    System.out.println("这是黑人私有方法");  }}

/** * 女娲 * @author tomsnail * @date 2015年4月1日 上午10:20:16 */public class Goddess {    public static int counter = 0;    private static final String[] humanClasss = new String[]{"com.tomsnail.java.test.reflec.BlackHuman","com.tomsnail.java.test.reflec.WhiteHuman","com.tomsnail.java.test.reflec.YellowHuman"};    //小伙伴  private List<Human> companions = new ArrayList<Human>();    private static final int number = 10;    /**   * 造人   * @author tomsnail   * @date 2015年4月1日 上午10:21:03   */  public void createHuman(){    int i=number;    while(--i>0){      String className = randomHuman();      try {        Class humanClass = Class.forName(className);        Human human = null;        if(System.currentTimeMillis()%i==1){          System.out.println("发生意外,创造一个不知道什么的人");          Constructor constructor = humanClass.getConstructor(SkinType.class);//构造方法          human = (Human) constructor.newInstance(SkinType.getSkinType());//通过构造方法创建一个对象        }else{          System.out.println("女娲创造一个 "+humanClass.getSimpleName());          human = (Human) humanClass.newInstance();        }        companions.add(human);      } catch (Exception e) {        e.printStackTrace();      }    }  }    private String randomHuman(){    int r = new Random().nextInt(3);    return humanClasss[r];  }  /**   * 生活   * @author tomsnail   * @date 2015年4月1日 上午10:27:09   */  public void life() throws Exception{    while(true){      try {        Thread.currentThread().sleep(1000);      } catch (InterruptedException e) {        e.printStackTrace();      }      Human human = companions.get(new Random().nextInt(number-1));      Class humanClass = human.getClass();      Field[] fs = humanClass.getSuperclass().getDeclaredFields();//父类属性      for(Field f:fs){        System.out.println(f.getName()+":"+humanClass.getMethod("get"+getMethodName(f.getName())).invoke(human, null));//打印出父类属性值      }      Method[] ms = humanClass.getSuperclass().getInterfaces()[0].getMethods();//获得接口方法      Method m = ms[new Random().nextInt(ms.length)];      m.invoke(human, null);//执行接口方法      Method pm = humanClass.getDeclaredMethod("selfMethod");//获得私有方法      pm.setAccessible(true);//可访问      pm.invoke(human, null);//执行私有方法    }  }    /**   * 将首字符改为大写   * @author tomsnail   * @date 2015年4月1日 上午11:40:48   */  private static String getMethodName(String fildeName) throws Exception{     byte[] items = fildeName.getBytes();     items[0] = (byte) ((char) items[0] - 'a' + 'A');     return new String(items);  }    public static void main(String[] args) throws Exception {    Goddess goddess = new Goddess();    goddess.createHuman();    goddess.life();  }  }

女娲创造一个 YellowHuman女娲创造一个 BlackHuman女娲创造一个 WhiteHuman女娲创造一个 WhiteHuman发生意外,创造一个不知道什么的人女娲创造一个 BlackHuman女娲创造一个 YellowHuman女娲创造一个 WhiteHuman我是黑人,我的皮肤颜色是:yellow
女娲创造一个 WhiteHumanname:white_7age:0sex:0skin:white我是白人,我在work
这是白人私有方法name:white_3age:0sex:0skin:white我是白人,我在eat
这是白人私有方法name:white_2我是白人,我在workage:0sex:0skin:white这是白人私有方法name:yellow_0我是黄种人,我在thinkage:0sex:0skin:yellow这是黄种人私有方法name:black_1我是黑人,我在work