重学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 ...
随机推荐
- ubantu 彻底卸载mysql
卸载mysql 第一步 1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server 3 ...
- Android-Android Studio 3.0找不到Android Device Monitor
原文:https://blog.csdn.net/yuanxiang01/article/details/80494842?utm_source=copy 为什么Android Studio 3. ...
- Navicat Premium创建事件计划调用MySql存储过程
1.检查事件计划,操作:工具——命令行界面——执行命令 show variables like '%event_scheduler%'; (分号不能丢)—— event_scheduler ON 表 ...
- C#Panel 控件的使用
Windows 窗体 Panel 控件用于为其他控件提供可识别的分组.通常,使用面板按功能细分窗体.例如,可能有一个订单窗体,它指定邮寄选项(如使用哪一类通营承运商).将所有选项分组在一个面板中可向用 ...
- 10分钟看懂, Java NIO 底层原理
目录 写在前面 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking ...
- Java多线程系列 基础篇01 线程的状态
1.进程和线程 进程: 计算机中程序关于某数据集合的一次运行活动,是计算机系统进行资源分配和调度的基本单位,是操作系统结构的基础. 线程: 线程是进程的实例,是CPU进行资源分配和调度的最小单位,线程 ...
- HDU 2138 How many prime numbers(Miller_Rabin法判断素数 【*模板】 用到了快速幂算法 )
How many prime numbers Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- iOS开发数据库-FMDB
前言 FMDB是以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了多线程安全的数据库操 ...
- BZOJ 1650 [Usaco2006 Dec]River Hopscotch 跳石子:二分
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1650 题意: 数轴上有n个石子,第i个石头的坐标为Di,现在要从0跳到L,每次条都从一个石 ...
- static语句块的执行时间
package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); Sys ...