笔主也是很长时间没有理解反射的概念;突然灵光一闪,理解一点,喜欢可以帮助大家;
首先我们建立一个person类
public class Person {
String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//包含一个带参的构造器和一个不带参的构造器
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
再建立一个测试类
public class test {
public static void main(String[] args) {
Class clazz = Person.class;
Field[] fields = clazz.getDeclaredFields();
Method[] declaredMethods = clazz.getDeclaredMethods();
Constructor[] constructors = clazz.getConstructors();
System.out.println(); //插入断点
}
}
运行结果
这就是反射。。。
可能会问,这个有什么用
一般的业务开发,我们很少要用到反射
1、反射的好处是:可以在运行时确认对象以及方法。
2、下面举个简单的例子来说下反射的运用场景:
假如一款游戏有一个配置文件,配置文件里有个renderType设置了游戏启动时调用哪个RenderHandler来渲染游戏,
(RenderHandler:一个接口,有一个render方法,HighRenderHandler、LowRenderHandler、MiddleRenderHandler等一共10个实现类)
那么游戏启动时必须获得一个RenderHandler来渲染游戏,现在有两种方式,一种是使用switch判断
1 //首先获得配置文件里的renderType
2 switch(renderType){
3 case "low":renderHandler=new LowRenderHandler();
4 case "high":renderHandler=new HighRenderHandler();
5 case "middle":renderHandler=new MiddleRenderHandler();
6 case "a":renderHandler=new ARenderHandler();
7 case "b":renderHandler=new BRenderHandler();
8 case "c":renderHandler=new CRenderHandler();
9 case "d":renderHandler=new DRenderHandler();
10 case "e":renderHandler=new ERenderHandler();
11 case "f":renderHandler=new FRenderHandler();
12 case "g":renderHandler=new GRenderHandler();
13 default:renderHandler=new LowRenderHandler();
14 }
15 renderHandler.render();
另一种是使用反射:
1 //首先从配置文件里获得renderType
2 RendeHandler renderHandler=(RendeHandler)Class.forName(rederType).newInstance();
3 renderHandler.render();
3、switch用了14行代码,而反射只使用了2行代码,现实中可能见不到这么傻的例子,但是这确实有助于理解反射。
参考链接