看一下百度的解释:
 
    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

最新文章

  1. ASP.NET MVC RenderPartial和Partial的区别
  2. JavaScript中map函数和filter的简单举例(转)
  3. 关于.Net的面试遐想
  4. radio button(单选按钮)
  5. 配置mysql5.5主从服务器(转)
  6. 关于Java中File的renameTo函数
  7. 结对编程——关于Fault、Error、Failure程序设计
  8. 利用jQuery实现选项卡
  9. JS 单元测试
  10. redis缓存技术
  11. 最新Android 出现Please ensure that adb is correctly located at问题的解决方法
  12. Windows Phone开发(27):隔离存储A
  13. C#隐式转换和显示转换举例--C#基础
  14. python之多线程通信
  15. bzoj3930
  16. 【剑指offer】字符串替换
  17. Python——eventlet
  18. java的多态示例
  19. Python自动化之高级语法单例模式
  20. Android学习笔记_48_若水新闻客户端源码剖析

热门文章

  1. 完好用户体验: 活用window.location与window.open解决页面跳转问题
  2. 字符串转化成十六进制输出StrToHex(Delphi版、C#版)
  3. 【转】soapUI和Jmeter的接口测试结构区别
  4. 【BZOJ1222】[HNOI2001]产品加工 DP
  5. 【题解】HNOI2013比赛
  6. cordova 插件创建
  7. (转)javascript中call()、apply()、bind()的用法
  8. 剑指Offer:二叉搜索树的后序遍历序列【33】
  9. ASCII 在线转换器
  10. 《程序员代码面试指南》第八章 数组和矩阵问题 打印N 个数组整体最大的Top K