重学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
女娲创造一个 WhiteHuman name:white_7 age:0 sex:0 skin:white 我是白人,我在work
这是白人私有方法 name:white_3 age:0 sex:0 skin:white 我是白人,我在eat
这是白人私有方法 name:white_2 我是白人,我在work age:0 sex:0 skin:white 这是白人私有方法 name:yellow_0 我是黄种人,我在think age:0 sex:0 skin:yellow 这是黄种人私有方法 name:black_1 我是黑人,我在work

 

你可能感兴趣的:(java基础)