提示:该文章主要根据b站韩顺平老师的视频学习而来
文章目录
- 前言
- 一、反射是什么?
- 二、使用步骤
- 1.加载类
- 2.获取对象实例
- 3.得到所加载类的方法
- 4.调用
- 总结
- 1.加载类
- 2.获取对象实例
- 3.得到所加载类的方法
- 4.调用
前言
Java的反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,例如:Field 成员变量、Constructer 构造器、 Method 成员方法),并且能够操作对象的属性以及方法。
反射在设计模式和底层框架中被广泛使用。
提示:以下是本篇文章正文内容,下面案例可供参考
一、反射是什么?
首先我们根据一个例子引出反射:
现在有一个Cat类:
public class Cat {
public String name;
public void hi(){
System.out.println("小猫喵喵叫");
}
public void cry(){
System.out.println("小猫哭了哦");
}
}
在同包下还有一个properties文件re.properties:
classfullpath=reflection_.Cat method=hi
此时,问题来了,如果我们要根据配置文件re.properties读取Cat的类信息并调用其方法,该怎么做呢?
我们的常规操作
Cat cat = new Cat();
cat.hi();
当我们需要调用cry时呢?是不是还得去修改源码?
我们不妨也可以想到,可以利用Properties类读写配置文件的方法
public class Test {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.load(new FileInputStream("src\reflection_\re.properties"));
String classfullpath = properties.get("classfullpath").toString();
String method = properties.get("method").toString();
System.out.println("classfullpath="+classfullpath);
System.out.println("method="+method);
}
}
然后呢?
然后呢?
new classfullpath()? 显然是行不通的,Java虚拟机时不会给你编译通过的。
所以后面我们试试用Java的反射机制来搞一搞。
二、使用步骤
1.加载类
代码如下(示例):
//加载类 返回对应的cls对象 Class cls = Class.forName(classfullpath);
2.获得对象实例
通过cls对象,我们可以通过newInstance()方法获得对象实例。
代码如下(示例):
Object o = cls.newInstance();//因为newInstance返回的编译类型为Object
Syetem.out.println(o.getClass());//输出为真正Class对象所对应的类,也是它的运行类型
通过cls对象,我们可以通过newInstance()方法获得对象实例。
代码如下(示例):
Object o = cls.newInstance();//因为newInstance返回的编译类型为Object Syetem.out.println(o.getClass());//输出为真正Class对象所对应的类,也是它的运行类型
补充:实际上newInstance()在目前已经过时了,Java现在不建议直接像上述方法一样创建对象,它更建议我们先获得构造器,再由构造器去调用newInstance()来创建对象。
例如:
Constructor constructor = cls.getConstructor(); Object o = constructor.newInstance();3.得到所加载类的方法
代码如下(示例):
Method method = cls.getMethod("hi");
4.调用
反射中的调用与传统的调用不一样
代码如下(示例):
method.invoke(o)
总结
在加载完类之后,在堆中就产生了一个Class类型的对象(注意这个Class与class要区别开,Class也是一个跟普通类差不多的类),这个对象包含了类的完整结构信息。通过这个对象,我们可以得到这个类的结构。这个Class对象就像一面镜子,透过这个镜子呢,我们就可以看到类的结构,所以形象的称为:反射。
以上就是一些简单的对反射的认识,后面Java小菜鸡还会继续更新。



