介绍Java中的反射并举例至少5个反射中常用的API-----Java基础相关面试题分享
反射介绍
反射(Reflection)是编程语言中的一种特性,它允许程序在运行时检查和操作自身的结构和行为。反射在许多高级编程任务中非常有用,如依赖注入、序列化、动态代理等。以下是 Java 中反射 API 的一些常用方法及其示例。
Java 反射 API 常用方法
-
Class.forName(String className)
:- 通过类的全限定名(包名+类名)获取
Class
对象。 - 示例:
1try { 2 Class<?> clazz = Class.forName("java.util.ArrayList"); 3 System.out.println("Class name: " + clazz.getName()); 4} catch (ClassNotFoundException e) { 5 e.printStackTrace(); 6}
- 通过类的全限定名(包名+类名)获取
-
Class.getConstructor(Class... parameterTypes)
:- 获取指定参数类型的构造器对象。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.util.ArrayList"); 3 Constructor<?> constructor = clazz.getConstructor(int.class); 4 System.out.println("Constructor: " + constructor); 5} catch (Exception e) { 6 e.printStackTrace(); 7}
-
Constructor.newInstance(Object... initargs)
:- 使用指定的构造器创建新的实例。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.util.ArrayList"); 3 Constructor<?> constructor = clazz.getConstructor(int.class); 4 Object instance = constructor.newInstance(10); 5 System.out.println("Instance: " + instance); 6} catch (Exception e) { 7 e.printStackTrace(); 8}
-
Class.getMethod(String name, Class... parameterTypes)
:- 获取指定名称和参数类型的公共方法。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.lang.String"); 3 Method method = clazz.getMethod("toUpperCase"); 4 System.out.println("Method: " + method); 5} catch (Exception e) { 6 e.printStackTrace(); 7}
-
Method.invoke(Object obj, Object... args)
:- 调用指定对象上的方法。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.lang.String"); 3 Method method = clazz.getMethod("toUpperCase"); 4 String str = "hello"; 5 Object result = method.invoke(str); 6 System.out.println("Result: " + result); 7} catch (Exception e) { 8 e.printStackTrace(); 9}
-
Class.getDeclaredField(String name)
:- 获取指定名称的字段(包括私有字段)。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.lang.String"); 3 Field field = clazz.getDeclaredField("value"); 4 System.out.println("Field: " + field); 5} catch (Exception e) { 6 e.printStackTrace(); 7}
-
Field.setAccessible(boolean flag)
:- 设置字段是否可以访问(忽略访问权限)。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.lang.String"); 3 Field field = clazz.getDeclaredField("value"); 4 field.setAccessible(true); 5 String str = new String("hello"); 6 char[] value = (char[]) field.get(str); 7 System.out.println("Value: " + new String(value)); 8} catch (Exception e) { 9 e.printStackTrace(); 10}
-
Field.get(Object obj)
:- 获取指定对象上字段的值。
- 示例:
1try { 2 Class<?> clazz = Class.forName("java.lang.String"); 3 Field field = clazz.getDeclaredField("value"); 4 field.setAccessible(true); 5 String str = new String("hello"); 6 char[] value = (char[]) field.get(str); 7 System.out.println("Value: " + new String(value)); 8} catch (Exception e) { 9 e.printStackTrace(); 10}
总结
以上是一些常用的 Java 反射 API 及其示例。反射提供了强大的功能,但使用时需要注意性能开销和安全性问题。反射通常用于框架开发、测试工具和其他需要动态访问或修改类结构的场景。