先说下反射机制的概念:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
那么我们再来说下反射机制实现需要用到的类,总共有四大类:Class,Constructor,Method,Field。
其实实现反射需要如下几个步骤:
1.获取Class类
2.通过Class创建对象
3.获取类中的方法
4.获取类中的属性,属性值或类型
首先来说一下获取Class的三种方法
public static voidmain(String[] args) {//第一种方式 通过对象获取Class
Student student = newStudent();
Class sc=student.getClass();
}
public static voidmain(String[] args) {//第二种方式 直接通过类名获取
Class sc2=Student.class;
}
//第三种方式 通过类的全称获取(使用forName方法)
Class sc3=Class.forName("com.java.Student"); //其实就是这个类所在的包的路径
接下来通过Instance方法实例化对象
//使用newInstance方法来创建实例对象。
Student s1=(Student)sc.newInstance(); //这里需要强转一下,因为创建出来的的对象是Object类型的
最后就是通过创建Field对象和Method对象来获取属性和方法(这里如果想要实现动态输入必须要使set方法的setAccessible方法为true)
Field f1=s1.getClass().getDeclaredField("name"); //获取方法中的name属性
Method getm1=s1.getClass().getDeclaredMethod("getName", new Class[]{}); //获取getname方法 这里的getName是可以修改成你想获取的方法
Method setm1=s1.getClass().getDeclaredMethod("setName", new Class[]{f1.getType()});//这里的fi.getType是为了获取setName输入时的类型
setm1.setAccessible(true); //设置setm1是可访问的
setm1.invoke(s1, "abc"); //通过setm1输入值
System.out.println(getm1.invoke(s1, null)); //通过getm1获取值
这段代码是可以获取到你所输入的值,如果只是想要获取属性或方法的名字只需要前两行!
上面介绍的是获取单一属性方法的办法,
也可以获取整个类的所有属性和方法如下代码所示:
Field []f = s1.getClass().getDeclaredFields();//获取方法中所有的属性
for(Field inputf :f){ //输出所有的属性
System.out.println(inputf);
}
Method[] allmethod= s1.getClass().getDeclaredMethods();//获取类中所有的方法
for(Method inputm : allmethod){ //输出所有的方法
System.out.println(inputm);
}
这就是使用反射机制的具体步骤。
最后总结如下:
我们通过整体代码可以知道,我们是可以通过用户的输入来调取某个类的某个方法或属性,或是获取某个类的所有方法或属性,这也就对应了解到了开头我们所说的反射的概念:动态获取信息以及动态调用对象方法的功能称为java语言的反射机制