JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
简而言之,反射就是可以通过名称来得到对象(类,属性,方法)的技术。
一.获取类对应的Class对象
1. getClass()方式: Object类中的方法,每个类都拥有此方法,如:
String str = new String();
Class cls = str.getClass();
2.类名.class方式,如:
Class cls = String.class;
3. Class.forName()方式,如:
try {
Class cls = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
二.构造一个类的实例
1. 调用无参的构造函数:
Class cls = Student.class;
try {
Student stu = (Student) cls.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2. 调用有参的构造函数
try {
Class cls = Class.forName("com.zero.Student");
//指定参数的Class,来决定调用那个构造函数
Constructor cons = cls.getConstructor(String.class, int.class);
Student stu = (Student) cons.newInstance("zero", 10);
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException | NoSuchMethodException
| SecurityException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
三.对象的属性操作
try {
Class cls = Student.class;// 首先得到class
Field[] fields = cls.getFields(); // 只能获取public修饰的field
for (Field field : fields) {
System.out.println(field.getName());
}
fields = cls.getDeclaredFields(); // 获取所有声明过的field
for (Field field : fields) {
System.out.println(field.getName());
}
Student stu = new Student("zero", 12);
Field stuFiled = stu.getClass().getDeclaredField("name"); // 获取private的field
stuFiled.setAccessible(true);// private访问权限打开,否则抛出java.lang.IllegalAccessException
System.out.println(stuFiled.get(stu));// 获取stu的name
Student student = Student.class.newInstance();
Field sFiled = Student.class.getDeclaredField("name");
sFiled.setAccessible(true);
sFiled.set(student, "zero123");// 为name字段设置值
System.out.println(sFiled.get(student));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
四.类方法操作
Method[] methods = Student.class.getMethods();
for (Method method : methods) {// 只获取Student的public修饰的method,以及Object的public修饰的method
System.out.println(method.getName());
}
Method[] methodss = Student.class.getDeclaredMethods();
for (Method method : methodss) { // 只获取Student所有的method,不包括Object的method
System.out.println(method.getName());
}
try {
Student student = new Student();
Method setMethod = student.getClass().getDeclaredMethod(
"setGender", String.class);//获取参数为String的setGender方法
setMethod.invoke(student,"man");
Method getMethod = student.getClass().getDeclaredMethod(
"getGender");//获取getGender方法
getMethod.setAccessible(true);//getGender方法是private,应该打开访问权限
String gender = (String) getMethod.invoke(student);
System.out.println(gender);
} catch (Exception e) {
e.printStackTrace();
}