什么是java 反射以及如何使用反射
最近在学spring框架也难免要接触反射,因此在这里简单介绍一下反射并且也相应的当作复习了
1.反射的作用?
大家在开发中可能会遇到这种情况:有时想要获取一个类中的成员变量但发现它是私有的,或者有时想要调用一个对象的私有方法却发现用一般方法难以实现,又或是想要打印一个类中的所有方法名或者变量名却发现束手无策时这时候就是反射发挥其作用的时候了。
2.反射的定义?
用别人的话来说,反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
用自己的话来说,反射是指在运行时(编译后的文件在java虚拟机上运行时)而不是编译时调用一个类的所有方法或属性的机制。
3.如何使用反射?(使用时记得导reflect包)
Student.class
public class Student {
private int id;
public String name;
private String gender;
private int age;
private int times;
public Student() {
}
public Student(int id,String name,String gender,int age,int times){
this.id = id;
this.name= name;
this.gender= gender;
this.age = age;
this.times = times;
}
public int getId() {
return id;
}
private void setId(int id) { //setter设为private仅作为测试使用
this.id = id;
}
//其它的方法
1.获取类的信息
方式一:
Class<?> cls = Class.forName(String className);//这里用了泛型但如果确认了类的类型就可以指定类型
方式二
Class<Student> cls = Student.class
方式三
Student s = new Student();
Class<?> cls = s.getClass();//getClass()返回的是Object类
2.获取构造方法
Class<Student> cls = Student.class;//使用第二种方式获取类的信息
Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);//获取带参数的构造方法
Constructor<?> c1 = cls.getConstructor();//获取不带参数的构造方法
Constructor<?>[] c2 = c.getConstructors();//获取所有构造方法
3.根据构造方法获取实例(注意: newInstance方法返回的是Object类所以如果要用其它的类接收则必须强转)
Class<Student> cls = Student.class;//使用第二种方式获取类的信息
Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);//先获取带参数的构造方法
Object o = c0.newInstance(1,"zygswo","男",1,1);//根据构造方法获取实例
Object o = cls.newInstance();//调用默认无参构造方法
4.获取成员变量
Class<Student> cls = Student.class;//使用第二种方式获取类的信息
Field f0 = cls.getDeclaredField("age");//获取当前类中定义的成员变量age(包括不可见的)
Field f1 = cls.getField("name");//获取当前类中可见的成员变量name(包括从父类中继承的成员变量)
Field[] f2 = cls.getDeclaredFields();//获取当前类中所有定义的成员变量(包括不可见的)
Field[] f3 = cls.getFields();//获取当前类中所有可见的成员变量(包括从父类中继承的成员变量)
5.获取方法
Class<Student> cls = Student.class;//使用第二种方式获取类的信息
Method m0 = cls.getDeclaredMethod("setId",int.class);//获取当前类中定义的方法setId(包括不可见的)由于有参数所以要传参数列表
Method m1 = cls.getMethod("getId");//获取当前类中可见的方法getId(包括重写的方法),由于有参数所以要传参
Method[] m2 = cls.getDeclaredMethods();//获取当前类中所有定义的方法(包括不可见的)
Method[] m3 = cls.getMethods();//获取当前类中所有可见的方法(包括重写的方法)
6.方法的调用
Class<Student> cls = Student.class;//获取类的信息
Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);
Object o = c0.newInstance(1,"zygswo","男",1,1);//获取实例
Method m = cls.getDeclaredMethod("setId",int.class);//获取方法
f0.setAccessible(true);//通过该方法来获取访问权限
f0.invoke(o,10); //调用方法
7.属性的赋值
Class<Student> cls = Student.class;//获取类的信息
Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);
Object o = c0.newInstance(1,"zygswo","男",1,1);//获取实例
Field f = cls.getDeclaredField("id");//获取属性
f.setAccessible(true);//通过该方法来获取访问权限
f.set(o,12);//赋值
8.其它
获取所有方法的名字和参数类型
Method[] a = c.getDeclaredMethods();
for (Method f : a) {
//获取类名
String n = f.getName();
//获取参数类型
Class<?>[] p = f.getParameterTypes();
System.out.println(n + "(" + Arrays.toString(p) + ")")
}
获取成员变量的信息
Field[] a = c.getDeclaredFields();
for (Field f : a) {
//获取类型的名字
String t = f.getType().getSimpleName();
//获取成员变量名字
String n = f.getName();
System.out.println(t+" "+ n);
}
——————————————结束语———————————————
有什么问题可以在评论区评论哦