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

时间:2021-07-08 23:55:17
    看一下百度的解释:
 
    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