看一下百度的解释:
 
    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基础(二):Java反射的更多相关文章

  1. java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  2. java基础二 java的跨平台特性

    一:java跨平台的特性: 1.生成不平台无关系的字节码. 2.通过和平台有关的jvm即java虚拟机来执行字节码.jvm不跨平台. 图示: 疑问:1.为什么我们不直接写字节码? 因为字节码只有jvm ...

  3. java基础(二):java内部类

    内部类像寄生虫一样生存在其他类[外部类]的内部.定义在类的内部的类叫内部类,它缩小了可见性.根据内部类定义结构的不同,可以把内部类分为 成员内部类和局部内部类.成员内部类定义的地方和外部类的成员变量和 ...

  4. 黑马程序猿————Java基础日常笔记---反射与正則表達式

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...

  5. Java入土--Java基础(二)

    Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...

  6. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  7. Java基础教程:反射基础

    Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...

  8. Java面试题总结之Java基础(二)

    Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...

  9. 黑马程序员:Java基础总结----java注解

    黑马程序员:Java基础总结 java注解   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...

随机推荐

  1. Hibernate demo之使用注解

    1.新建maven项目 testHibernate,pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  2. 【C/C++】高亮C++中函数的重写——函数名相同?参数列表相同?返回值相同?

    C++的重载给人留下了非常深刻的影响,原因是重载的条件很值得注意:函数名相同,参数列表不相同的两个函数构成重载函数,而无关乎二者的返回值. 但是C++中的函数重写又是另一码事.标准规定:只要函数名相同 ...

  3. Android锁屏状态下弹出activity,如新版qq的锁屏消息提示

    在接收消息广播的onReceive里,跳转到你要显示的界面.如: Intent intent = new Intent(arg0,MainActivity.class); intent.addFlag ...

  4. EasyNVR无插件流媒体服务器前端技术防止重复提交的方法

    现在随着接触EasyNVR时间越来越长,越发的觉得EasyNVR真的是一个"神器".从功能上来说自身不仅可以拉出来使用(具体功能搜索EasyNVR一定有惊喜!),也可以作为设备端与 ...

  5. SQL中的四种连接方式

    转自:http://www.cnblogs.com/afirefly/archive/2010/10/08/1845906.html 联接条件可在FROM或WHERE子句中指定,建议在FROM子句中指 ...

  6. var foo = "11"+2+"1"; console.log(foo); //1121 好多文章答案写错了,我发下给初学的朋友看到,以免一开始就学错了

    体会加一个字符串'1' 和 减去一个字符串'1'的不同 var foo = "11"+2-"1"; console.log(foo); //111 consol ...

  7. jQuery+CSS3动画相册特效

    在线演示 本地下载

  8. <算法笔记>关于快速排序的算法优化排序(顺便给百度百科纠个错)

    快速排序是排序算法之中的基本中的基本,虽然越来越多的接口函数将快速排序“完美的封装了起来”,比如C++中的qsort或者<algorithm>中的sort(与stable_sort相对应) ...

  9. SDUT OJ 1479 数据结构实验之栈:行编辑器

    数据结构实验之栈:行编辑器 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  一个简单的行编辑程序的功能是:接受用户从终端输入的程 ...

  10. Starting MySQL.. ERROR! The server quit without updating PID file

    版权声明:本文为博主原创文章,未经博主允许不得转载. 注意:本文出自 “阿飞”的博客 ,如果要转载本文章,请与作者联系! 并注明来源: http://blog.csdn.net/faye0412/ar ...