Java第四课 - Java反射的学习(一)
定义
先来看下百度百科的定义。
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。
翻译一下,就是通过反射机制,来获取类的名称,方法,修饰符等等。
这么说可能会有点抽象,我们来举个栗子。
举个栗子
定义SysUser类
这个是一个基础的系统用户的类,用来描述系统用户的账号、密码。
注意,这里的userName,我定义为了public类型。
public class SysUser {
private int userId;
public String userName;
private String password;
public void sayHello(){
System.out.println("hello");
}
}
定义main方法
由于是演示,这里就直接放在main方法,方便演示。
定义对象,获取Class
SysUser sysUser = new SysUser();
Class<? extends SysUser> sysUserClass = sysUser.getClass();
得到sysUserClass这个对象之后,可以做什么呢?我们进入一下Class这个类去看看。

可以看到,有许许多多的方法,我们挑选几个来说明一下。
获取对象的名称,包含整个包名。
String sysUserClassName = sysUserClass.getName();
System.out.println(sysUserClassName);
打印结果为
com.mowie.javastudy.javaclass.SysUser
接着,我们来试着打印一下字段,即属性。
Field[] fields = sysUserClass.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
打印结果为
userName
可以看到,结果是一个数组我们是定义了三个字段,但是这里只显示了一个。说明,getFields()方法只会显示public修饰的字段。
接着,我们再来打印一下方法。
Method[] methods = sysUserClass.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
打印结果为
main
sayHello
wait
wait
wait
equals
toString
hashCode
…
所以也可以看到getMethods()方法,同时也会把超级父类Object的方法也给打印出来的。
main方法的代码如下。
public static void main(String[] args) {
SysUser sysUser = new SysUser();
Class<? extends SysUser> sysUserClass = sysUser.getClass();
String sysUserClassName = sysUserClass.getName();
System.out.println(sysUserClassName);
Field[] fields = sysUserClass.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
Method[] methods = sysUserClass.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
通过类名创建对象
我们换个思路,平时我们创建对象,都是通过new关键词。
如果我们现在已经知道了包名以及类名,是否可以通过反射来创建对象呢?答案是肯定的。
举个栗子
同样的,我们也直接在main方法里面进行演示就好了。
首先,是把包名以及类型定义好。接着,通过Class.forName()方法,把Class对象给创建出来。
Class有了之后,再通过newInstance()方法,进行实例化对象。
我们也可以看到,这里实例化出来的对象,是一个Object类型的对象。所以我们需要进行强制转换。
强制转换后,我们调用SysUser的方法sayHello。可以看到,打印出来的结果就是:hello。
这就说明了,我们的对象创建成功啦!
public static void main(String[] args) {
String className = "com.mowie.javastudy.javaclass.SysUser";
try {
Class<?> aClass = Class.forName(className);
Object o = aClass.newInstance();
SysUser sysUser = (SysUser) o;
sysUser.sayHello();
}catch (Exception e){
e.printStackTrace();
}
}
总结
通过反射,其实是可以做到很多很灵活的操作的,例如在代码中获取对象名、对象方法等等。
具体看操作场景,我们这里也就先熟悉一下,以后要运用的时候,知道有反射这个东西就可以了。
本文深入讲解Java反射机制,包括其定义、如何通过反射获取类的名称、方法和属性,以及如何利用反射创建对象。通过实例演示,展示了反射在动态获取信息及调用对象方法上的强大功能。

被折叠的 条评论
为什么被折叠?



