Java反射的一些关键知识点:
-
Class类:
- 每个类都有一个Class对象,可以通过
.class
关键字或者getClass()
方法获取。 - 可以通过
Class.forName(String className)
加载一个类。
- 每个类都有一个Class对象,可以通过
-
获取类型信息:
- 使用
getFields()
和getDeclaredFields()
获取字段信息。 - 使用
getMethods()
和getDeclaredMethods()
获取方法信息。 - 使用
getConstructors()
和getDeclaredConstructors()
获取构造器信息。
- 使用
-
创建对象:
- 通过
newInstance()
方法创建一个类的新实例(需要无参构造器)。 - 通过
getConstructor().newInstance(args)
使用指定构造器创建实例。
- 通过
-
调用方法:
- 使用
getMethod(String name, Class<?>... parameterTypes)
获取公共方法。 - 使用
getDeclaredMethod(String name, Class<?>... parameterTypes)
获取指定的方法。 - 调用方法:
method.invoke(object, args)
。
- 使用
-
设置字段值:
- 获取字段:
getField(String name)
或getDeclaredField(String name)
。 - 设置字段值:
field.set(object, value)
。
- 获取字段:
-
修改访问权限:
- 如果需要访问私有成员,则需要调用
setAccessible(true)
。
- 如果需要访问私有成员,则需要调用
-
注意事项:
- 反射可能会破坏封装性。
- 反射通常比直接访问慢,因为它涉及到更多的安全检查。
- 在使用反射之前最好确认其必要性,避免滥用。
反射在某些场景下非常有用,比如在框架开发、动态代理、插件机制等场景中。