重学JAVA基础(二):Java反射
/**
* 行为,区别于动物
* @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反射的更多相关文章
- java基础(二)-----java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java基础二 java的跨平台特性
一:java跨平台的特性: 1.生成不平台无关系的字节码. 2.通过和平台有关的jvm即java虚拟机来执行字节码.jvm不跨平台. 图示: 疑问:1.为什么我们不直接写字节码? 因为字节码只有jvm ...
- java基础(二):java内部类
内部类像寄生虫一样生存在其他类[外部类]的内部.定义在类的内部的类叫内部类,它缩小了可见性.根据内部类定义结构的不同,可以把内部类分为 成员内部类和局部内部类.成员内部类定义的地方和外部类的成员变量和 ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- Java入土--Java基础(二)
Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
- Java面试题总结之Java基础(二)
Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...
- 黑马程序员:Java基础总结----java注解
黑马程序员:Java基础总结 java注解 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...
随机推荐
- 01-jsp与javabean
<%@page import="java.util.Date"%><%@ page language="java" contentType=& ...
- erlang中判断进程是否存活
一个参数的方法是已知Pid判断进程是否存活.两个参数的方法是已知节点和Pid或进程名判断进程是否存活. is_process_alive(Pid) when is_pid(Pid)->rpc:c ...
- Linq的优缺点
优点: 1.Linq提供了不同数据源的抽象层,所以可以使用相同的语法访问不同的数据源(只要该数据源有提供程序即可) 2.Linq为底层的数据存储提供了一个强类型化的界面,可以把底层的数据作为对象来访问 ...
- squid代理缓存服务器
参考文章 http://www.cnblogs.com/mchina/p/3812190.html ;
- Activity设置style透明后与SurfaceView合用引发的无形命案
近期搞视频通话,SurfaceView是不可缺少的,因为启动视频要载入一些资源,比較耗时.会有1.2s黑屏的现象,为了改善用户体验,我们须要设置Activity的Theme为透明风格(QQ 也是如此) ...
- [容易] A + B 问题
题目来源:http://www.lintcode.com/zh-cn/problem/a-b-problem/
- Java实参和形参与传值和传引用
实参和形参的定义: 形参出现函数定义中,在整个函数体内都可以使用,离开函数则不能使用. 实参出现在主函数中,进入被调函数后,实参变量也不能使用. 形参和实参的功能是做数据传送.发生函数调用时,主调函数 ...
- 使用了Tomcat JDBC连接池不能重连的问题
在项目中用到了tomcat 的jdbc连接池,发现一个问题是,当数据库重启时,服务没有重新的去连接数据库,需要将部署的项目重新启动才能连接到数据库.经过测试对配置做一下修改: 在配置dataSourc ...
- Java for LeetCode 127 Word Ladder
Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...
- LeetCode:寻找旋转排序数组中的最小值【153】
LeetCode:寻找旋转排序数组中的最小值[153] 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...