反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1.获取Class对象的三种方式
- 类名.class
- Class.forName(全路径类名)
- 类的实例化对象.getClass()
2.通过反射获取构造方法、成员变量、成员方法
通过反射获取构造方法、成员变量、成员方法的方法基本一致,所以只把通过反射获取构造方法的方法全部列举。
Constructor getDeclaredConstructor(Class… parameterTypes)
获取此 Class 对象所表示的类的指定构造方法(包括私有和默认修饰)
Constructor[] getDeclaredConstructors()
获取此 Class 对象表示的类声明的所有构造方法
Constructor getConstructor(Class… parameterTypes)
获取此 Class 对象所表示的类的指定公共构造方法
Constructor<?>[] getConstructors()
获取此 Class 对象所表示的类的所有公共构造方法
2.1 通过反射获取构造方法
public class Reflect_Constructor {
public static void main(String[] args) throws Exception {
//获取Class对象
Class<?> c = Class.forName("getclassobject.Student");
//Constructor[] getDeclaredConstructors() 获取此 Class 对象表示的类声明的所有构造方法。
Constructor<?>[] constructors = c.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
//Constructor<T> getConstructor(Class... parameterTypes) 获取此 Class 对象所表示的类的指定公共构造方法。
Constructor<?> con = c.getConstructor(String.class, int.class, String.class);
//通过获取的构造方法创建对象
Object o = con.newInstance("张三", 22, "男");
System.out.println(o);
//Constructor getDeclaredConstructor(Class... parameterTypes) 获取此 Class 对象所表示的类的指定构造方法(包括私有和默认修饰)
Constructor<?> dc = c.getDeclaredConstructor(String.class);
//如果构造方法的权限修饰符为private,则需要暴力反射才能创建对象
//public void setAccessible(boolean flag):值为true,取消java语言访问权限检查
dc.setAccessible(true);
Object s = dc.newInstance("男");
System.out.println(s);
}
}
2.2 通过反射获取成员变量
public class Reflect_Field {
public static void main(String[] args) throws Exception {
Student stu=new Student();
Class<? extends Student> c = stu.getClass();
//public Field getDeclaredField(String name) 获取由此Class对象表示的类或接口的指定声明字段
//传入的参数为成员变量的名称
Field fieldName = c.getDeclaredField("name");
fieldName.setAccessible(true);
//设置stu对象的name为张三
fieldName.set(stu,"张三");
//获取stu对象的name属性值
Object o1 = fieldName.get(stu);
System.out.println(o1);
}
}
2.3 通过反射获取成员变量
public class Reflect_Method {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//获取class对象
Class<Student> c = Student.class;
//获取无参构造方法
Constructor<?> dc = c.getDeclaredConstructor();
//实例化对象
Object obj = dc.newInstance();
//获取方法(参数为要获取的方法名)
Method method = c.getDeclaredMethod("publicMethod");
//调用obj对象的publicMethod方法
method.invoke(obj);
System.out.println("----------");
//获取方法,该方法需要一个String类型的参数
Method method1 = c.getDeclaredMethod("method", String.class);
method1.setAccessible(true);
//调用obj对象的method方法,并传入字符串"reverse"
Object reverse = method1.invoke(obj, "reverse");
System.out.println(reverse);
}
}