目录
前言
本篇文章将介绍反射机制的简单使用~
一、类对象的概念
类对象的概念:所有的类,都有类对象,类对象用来提供类本身的信息,比如有哪几种构造方法, 有多少属性,有哪些普通方法等。
二、获取类对象
获取类对象有3种方法:
前提:有一个类 例:Student类 ,写简单点。
public class Student {//实体类
private String name;//设置为私有变量和ger方法,这样是一个标准的bean类,用于后续jsp使用EL技术自动调用get方法的
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override//此注解表示此方法是重新的父类方法
public String toString() {//重写toString 方便后续测试用
return name;
}
}
(1)通过类名.Class来获取:
Class aclass = Student.class;
(2)通过实例化对象.getClass来获取:
Student st = new Student();
Class bclass = st.getClass();
(3)通过Class.forName("包名.类名");来获取:
Class cclass = Class.forName("包名.Student");//需要写在try里面
三、使用类对象来创建对象
代码如下(示例):
Student st = new Student();
Class aclass = st.getClass();//获取类对象
Constructor c = null;//创建构造器
Student st1 = null;//声明一个对象
try {
c = a1.getConstructor();//获取构造器
//通过构造器来实例化得到对象
st1 = (Student) c.newInstance();//newInstance()返回为Object类型,需要强类型转化为原类型
}catch (Exception e){
e.printStackTrace();
}
四、访问属性并修改属性
代码如下(示例):
Student st = new Student();
st.setName("洛云");
System.out.println(st);//打印出洛云
Class aclass = st.getClass();
Field fd = null;//我理解为一个装属性的容器
try {
fd = aclass.getDeclaredField("name");//获取名字为username的属性字段,使用getFiled()方法也可以
//修改对象中的该属性
fd.set(st,"希儿");//第一个参数表示要修改的对象,第二个参数表示要将该对象在fd中的属性的属性值修改成的值。
System.out.println(st);//打印出希儿
}catch (Exception e){
e.printStackTrace();
}
(1)getFiled()方法与getDeclaredField()方法的区别:
getFiled只能获取public访问权限的属性字段,包括从父类继承的。
getDeclaredField能获得本类全部访问权限的属性字段,除了继承的。
五、调用方法
代码如下(示例):
Student st = new Student();
Class aclass = st.getClass();
System.out.println(st.getName());//打印null
try {
// 获取Method 类,相当于获取到所要调用的方法
Method method = aclass.getMethod("setName",String.class);//getMethod(name,类型.class):name参数为需要调用的方法名,后面的参数为:该方法中参数类型.class,如果有2个或多个参数,例如方法f(String int) 则该参数为String.class,int.class
//调用方法
method.invoke(st,"希儿");//调用st对象中的上述获取到的方法,后面给出所要传递的参数,有几个参数给几个参数。
System.out.println(st.getName());//打印希儿
}catch (Exception e){
e.printStackTrace();
}
六、反射机制的简单运用
例:假设在一个Servlet里写了多个业务处理方法,如处理登录的login()方法,退出的exit()方法。当我们在前端页面点击登录或退出时,我们传递一个参数method【此method不是form标签的属性method】。点击登录,传递method="login";点击退出,传递method="exit";这样在Servlet类里面,我们获取到method参数,根据反射机制中的方法getMethod(method,...参数);就会调用不同的方法,处理不同的业务。
这样的好处:我们可以将同类型的业务处理放在同一个Servlet类里,根据触发不同的事件,传递不同的参数method,调用不同方法,处理不同的业务。
关于前端页面传递参数涉及到Servlet方面的知识,此文不做过多描述~感兴趣的同学可以自行搜索。
总结
(1)一些基础简单的反射机制运用,有收获的同学请点个赞~
(2)因为是第一次发文,有任何不足或错误的地方,请友好提出~
(3)以上内容均为本人学习知识后,按照自己理解来一字一码编写的~
(4)关于反射机制肯定还有许许多多的方面,这里只是提到了一点点。
(5)看到这里,想必你也是为了提升自我努力吧~,一起加油吧~ ~( ̄▽ ̄~)(~ ̄▽ ̄)~