概念
Java的反射机制是指:
1.利用反射可以无视修饰符获取类中所有的属性和方法。
2.先获取配置文件中的信息,动态获取信息并创建对象和调用方法。
// 1.利用Class中的静态方法forName(String 全类名)
Class<?> aClass = Class.forName("domain.Student");
System.out.println(aClass);
// 2.通过Class属性来获取
Class<?> bClass = Student.class;
System.out.println(bClass);
// 3.通过对象的getClass方法来获取对象,该方法是定义在Object中的
Student s = new Student();
Class<?> cClass = s.getClass();
System.out.println(cClass);
System.out.println(aClass == bClass);
System.out.println(bClass == cClass);
打印结果:
class domain.Student
class domain.Student
class domain.Student
true
true
1.类的属性都是Field对象。
2.类的构造方法都是Constructor对象。
3.类的成员方法都是Method对象。
Class中的方法:
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
//Constructor>[] getConstructors()返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
Constructor<?>[] constructors = aClass.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
//Constructor>[] getDeclaredConstructors()返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的数组 类 。
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
//Constructor getConstructor(Class>... parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共 类函数。
// 注意:小括号中必须跟方法的形参保持一致,并且方法必须是public的
Constructor<?> constructor1 = aClass.getConstructor();
System.out.println(constructor1);
Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class);
System.out.println(constructor2);
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
//Constructor getDeclaredConstructor(Class>... parameterTypes)返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定 类函数。
// 该方法可以获取类中任何权限的方法
Constructor<?> declaredConstructor1 = aClass.getDeclaredConstructor(String.class, int.class);
System.out.println(declaredConstructor1);
利用Constructor创建对象
1.T newInstance(Object…) // 根据指定构造方法创建对象。
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取构造方法对象
Constructor<?> constructor = aClass.getConstructor(String.class, int.class);
// 利用newInstance方法创建对象
Student zhangsan = (Student)constructor.newInstance("zhangsan", 23);
System.out.println(zhangsan);
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取构造方法对象
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, int.class);
// 若要使用反射强行使用private修饰的构造方法创建对象
// 需要调用以下方法
constructor.setAccessible(true);// 暴力反射
// 利用newInstance方法创建对象
Student zhangsan = (Student)constructor.newInstance("zhangsan", 23);
System.out.println(zhangsan);
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取public修饰的成员变量
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取所有成员变量
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取指定存在的public成员变量
Field name = aClass.getField("name");
System.out.println(name);
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取指定存在的私有成员变量
Field birthday = aClass.getDeclaredField("birthday");
System.out.println(birthday);
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取Field对象
Field name = aClass.getField("name");
// 利用Field中的set方法进行赋值
Student stu = (Student) aClass.newInstance();
name.set(stu, "zhangsan");
System.out.println(stu);
// 利用Field中的get方法获取属性值
Object o = name.get(stu);
System.out.println(o);
若所赋值的成员变量是私有的:
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取Field对象
Field birthday = aClass.getDeclaredField("birthday");
birthday.setAccessible(true); // 暴力反射
// 利用Field中的set方法进行赋值
Student stu = (Student) aClass.newInstance();
birthday.set(stu, "2020-11-11");
System.out.println(stu);
// 利用Field中的get方法获取属性值
Object o = birthday.get(stu);
System.out.println(o);
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取公共成员方法
Method[] methods = aClass.getMethods();// 会同时获取父类继承下来的方法
for (Method method : methods) {
System.out.println(method);
}
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取所有成员方法
Method[] methods = aClass.getDeclaredMethods();// 不会获取父类的方法
for (Method method : methods) {
System.out.println(method);
}
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
// 获取指定public成员方法
Method setName = aClass.getMethod("setName", String.class);
// 获取指定private成员方法
Method setSid = aClass.getDeclaredMethod("setSid", String.class);
System.out.println(setName);
System.out.println(setSid);
通过Method运行获取到的方法
Object invoke(Object obj, Object…)
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
Method function = aClass.getMethod("function", String.class);
// 以下则是调用获取到的方法的过程
Student stu = (Student) aClass.newInstance();
Object zhang = function.invoke(stu, "zhang");
System.out.println(zhang);
若function是私有的:
// 获取Class对象
Class<?> aClass = Class.forName("domain.Student");
Method function = aClass.getDeclaredMethod("function", String.class);
function.setAccessible(true); // 暴力反射
// 以下则是调用获取到的方法的过程
Student stu = (Student) aClass.newInstance();
Object zhang = function.invoke(stu, "zhang");
System.out.println(zhang);