Class类的详细说明
Class 类是Java反射机制的核心,每个Java类或接口在JVM中都有一个对应的 Class 对象,用于表示该类的元数据(如类名、方法、字段、构造器等)。以下是其核心知识点:
1. 获取Class对象的三种方式
方式 示例 适用场景 类名.class Class<String> clazz = String.class;已知具体类名,编译时确定。 对象.getClass() String s = "hello"; Class<?> clazz = s.getClass();通过已有对象获取类信息。 Class.forName() Class<?> clazz = Class.forName("java.lang.String");动态加载类,需全限定类名(全限定类名是带有包名的)。
2. Class类的核心方法
(1) 获取类的基本信息
方法 作用 String getName()返回全限定类名(如 java.lang.String)。 String getSimpleName()返回简单类名(如 String)。 Package getPackage()返回类所在的包信息(包名、注解等)。 int getModifiers()返回类的修饰符(如 public、final),需配合 Modifier 类解析。 boolean isInterface()判断是否为接口。
(2) 获取继承关系
方法 作用 Class<?> getSuperclass()返回直接父类的 Class 对象(若为 Object 则返回 null)。 Class<?>[] getInterfaces()返回类实现的所有接口的 Class 数组。
(3) 操作字段(Field)
方法 作用 Field getField(String name)获取指定名称的公共字段 (包括继承的)。 Field getDeclaredField(String name)获取类声明的字段(包括私有、受保护),不包含继承字段 。 Field[] getFields()获取所有公共字段(包括继承的)。 Field[] getDeclaredFields()获取类声明的所有字段(包括私有、受保护)。
(4) 操作方法(Method)
方法 作用 Method getMethod(String name, Class<?>... parameterTypes)获取指定名称和参数的公共方法 (包括继承的)。 Method getDeclaredMethod(String name, Class<?>... parameterTypes)获取类声明的指定方法(包括私有、受保护),不包含继承方法 。 Method[] getMethods()获取所有公共方法(包括继承的)。 Method[] getDeclaredMethods()获取类声明的所有方法(包括私有、受保护)。
(5) 操作构造器(Constructor)
方法 作用 Constructor<?>[] getConstructors()获取所有公共构造方法。 Constructor<?>[] getDeclaredConstructors()获取所有声明的构造方法(包括私有)。 Constructor<T> getConstructor(Class<?>... parameterTypes)获取指定参数类型的公共构造方法。 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)获取指定参数类型的声明构造方法(包括私有)。
(6) 实例化对象
方法 作用 T newInstance()已过时 :通过默认无参构造器创建实例(需存在无参构造方法)。替代方案 :通过 Constructor 对象示例: ```java Constructor constructor = User.class.getConstructor(String.class); User user = constructor.newInstance(“Alice”); ```
(7) 其他实用方法
方法 作用 Annotation[] getAnnotations()获取类上的所有注解(包括元注解)。 ClassLoader getClassLoader()返回类的类加载器。 boolean isArray()判断是否为数组类型。 Class<?> getComponentType()返回数组类型的元素类型(如 String[].class.getComponentType() → String.class)。
3. 示例代码
(1) 获取类信息
Class < ? > clazz = Class . forName ( "java.util.ArrayList" ) ;
System . out. println ( "类名: " + clazz. getName ( ) ) ;
System . out. println ( "简单类名: " + clazz. getSimpleName ( ) ) ;
System . out. println ( "包名: " + clazz. getPackage ( ) . getName ( ) ) ;
(2) 操作私有字段
public class User { private String name; public User ( String name) { this . name = name; }
} Class < User > clazz = User . class ;
User user = clazz. getConstructor ( String . class ) . newInstance ( "Alice" ) ; Field nameField = clazz. getDeclaredField ( "name" ) ;
nameField. setAccessible ( true ) ;
nameField. set ( user, "Bob" ) ;
System . out. println ( nameField. get ( user) ) ;
(3) 调用私有方法
public class Calculator { private int add ( int a, int b) { return a + b; }
} Class < Calculator > clazz = Calculator . class ;
Calculator calc = clazz. newInstance ( ) ; Method addMethod = clazz. getDeclaredMethod ( "add" , int . class , int . class ) ;
addMethod. setAccessible ( true ) ;
int result = ( int ) addMethod. invoke ( calc, 3 , 5 ) ;
System . out. println ( result) ;
4. 注意事项
性能开销 :反射操作比直接调用慢约10倍,避免高频使用。安全限制 :私有成员访问需调用 setAccessible(true),可能触发安全管理器异常。代码可读性 :反射代码较难维护,需添加详细注释。兼容性 :反射可能因JDK版本或类结构变化而失效。
总结
Class 类是Java反射的基石,通过它可以在运行时动态获取和操作类信息。核心方法涵盖类结构解析、实例化、字段/方法访问等场景,但在生产环境中需谨慎使用,权衡灵活性与性能、安全性的关系。