反射机制
通过反射实现,作为框架|技术的底层出现
可以不用频繁的修改源代码,增强代码的可用性,灵活性
-
Java反射机制,可以实现以下功能:
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
-
获取Class对象的方式:
-
对象.getClass();
-
类名.class ;
-
Class.forName(“包名+类名”); 权限命名 – 推荐
Class cls1 = "字符串对象".getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1 == cls2); // true System.out.println(cls1 == cls3); // true System.out.println(cls3); // class java.lang.String
- 通过子类的Class对象获取到其父类的Class对象
Class obj = cls1.getSuperclass(); System.out.println(obj == Object.class); // true
- 基本数据类型|包装类 的Class对象
System.out.println(int.class); // int System.out.println(Integer.class); // class java.lang.Integer System.out.println(int.class==Integer.class); // false System.out.println(int.class==Integer.TYPE); // true
- Class类其他方法
// String getName() System.out.println(cls1.getName()); // java.lang.String // String getSimpleName() System.out.println(cls1.getSimpleName()); // String // int getModifiers() System.out.println(Modifier.toString(cls1.getModifiers())); // public final
-
-
反射操作构造器:
-
Constructor getConstructor(Class<?>… parameterTypes):获取指定公共构造方法
-
Constructor<?>[] getConstructors():获取所有公共的构造器
-
Constructor getDeclaredConstructor(Class<?>… parameterTypes):获取指定的构造方法
-
Constructor<?>[] getDeclaredConstructors():获取所有的构造方法
-
通过反射创建对象:
- Class 的 newInstance() 方法,创建对象时会调用空构造(如果没有报错)
- 通过 Constructor 的 newInstance() 方法,创建对象的同时执行使用哪一个构造器
public static void testConstructor(Class<?> cls) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { // 获取所有公共的构造方法 Constructor[] cons = cls.getConstructors(); for (Constructor constructor : cons) { System.out.println(constructor); } Constructor[] cons2 = cls.getDeclaredConstructors(); for (Constructor constructor : cons2) { System.out.println(constructor); } // 创建对象 User user = (User)cons[0].newInstance("Sun", 24, "123asd", "games"); System.out.println(user); // getDeclaredConstructor(Class<?>... parameterTypes) Constructor con = cls.getDeclaredConstructor(String.class, int.class); System.out.println(con); // 放开权限 con.setAccessible(true); User user2 = (User)con.newInstance("Cooper", 18); // 关闭权限 con.setAccessible(false); System.out.println(user2); // 创建对象 System.out.println(cls.newInstance()); }
-
-
反射操作属性:
-
Field getField(String name) name–>属性名:获取指定公共成员字段
-
Field[] getFields():获取所有公共成员字段
-
Field getDeclaredField(String name):获取指定已声明字段
-
Field[] getDeclaredFields():获取所有已声明字段
public static void testField(Class<?> cls) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException { User user = (User)cls.newInstance(); Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { System.out.println(field); } Field field = cls.getField("hobby"); // 设置值 set(Object obj, Object value) field.set(user, "games"); // 获取值 get(Object obj) System.out.println(field.get(user)); }
-
-
反射操作方法:
-
Method getMethod(String name, 类<?>… parameterTypes): 获取指定公共的成员方法
-
Method[] getMethods(): 获取所有公共方法
-
Method getDeclaredMethod(String name, 类<?>… parameterTypes): 获取指定声明的成员方法
-
Method[] getDeclaredMethods(): 获取所有声明的方法,但不包括继承的方法
-
执行方法:
- invoke(Object obj, Object… args): 对带有指定参数的指定对象调用由此 Method对象表示的底层方法
public static void testMethod(Class<?> cls) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException { User user = (User)cls.newInstance(); Method[] methods = cls.getDeclaredMethods(); for (Method method : methods) { System.out.println(method); } Method method = cls.getDeclaredMethod("test", Integer.class); method.setAccessible(true); method.invoke(user, 24); method.setAccessible(false); }
-
-
反射操作数组:
-
static Object newInstance(Class<?> componentType, int length)
-
创建一个具有指定的组件类型和长度的新数组
int[] arr = (int[]) Array.newInstance(int.class, 8); Array.set(arr, 0, 10); System.out.println(Array.get(arr, 0)); // 10 Class cls = arr.getClass(); System.out.println(cls.isArray()); // true
-