首页 > 学院 > 开发设计 > 正文

重学JAVA基础(二):Java反射

2019-11-14 23:33:26
字体:
来源:转载
供稿:网友
重学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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表