反射:获取类结构信息【Class、Package】
听说通过Class类反射,只要一个完全的类名就能够推理出类的所有信息?这不像极了电视里的推理剧?那这次我就来通过类的名字来查到该类的父类【也就是它爸爸,其实连它祖宗都能找到】,该类的包名【也就是它的家】,以及该类实现的接口【也就是它能做的事】。
先创建以下类:
苹果是一种能生长的水果
苹果是种水果
苹果能生长
所以苹果为水果的子类,实现生长的接口
Fruit
package javabase.entity;
public class Fruit {
}
Grow
package javabase.service;
public interface Grow {
}
Apple
package javabase.entity;
import javabase.service.Grow;
public class Apple extends Fruit implements Grow {
}
Main
package javabase;
public class Main {
public static void main(String[] args) throws Exception{
//这里获取Apple的Class实例化对象,需要Apple的全名【包.类名】
Class apple = Class.forName("javabase.entity.Apple");
//获取对应的包名
Package pack = apple.getPackage();
System.out.print("=====这是Apple所属的包====>");
System.out.println(pack.getName());
//一个类只能继承一个父类,所以只有一个
Class fruit = apple.getSuperclass();
System.out.print("=====这个是Apple的爸爸====>");
System.out.println(fruit.getName());
//一个类可以实现多个接口,所以是一个数组
System.out.print("=====这是Apple能做的事====>");
Class[] canDo = apple.getInterfaces();
for (int i=0; i<canDo.length; i++){
System.out.print(canDo[i].getName()+" ");
}
}
}
运行结果
=====这是Apple所属的包====>javabase.entity
=====这个是Apple的爸爸====>javabase.entity.Fruit
=====这是Apple能做的事====>javabase.service.Grow
苹果还能晒太阳呢!加多个SunBathe
的接口
SunBathe
package javabase.service;
public interface SunBathe {
}
Apple
package javabase.entity;
import javabase.service.Grow;
import javabase.service.SunBathe;
public class Apple extends Fruit implements Grow,SunBathe {
}
再运行刚刚的Main,我们就能发现有多一个接口出现
运行结果
=====这是Apple所属的包====>javabase.entity
=====这个是Apple的爸爸====>javabase.entity.Fruit
=====这是Apple能做的事====>javabase.service.Grow javabase.service.SunBathe
当然,还有一个getSimpleName()
的方法用于获取类的简单名,如javabase.entity.Fruit
就是Fruit
,还能通过该类的父类再查找该类的父类,也就是说,只要提供一个类的全名给Class,它就能帮你把该类的祖宗十八代都找出来,想想,还是有点兴奋的呢。