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反射的基石,通过它可以在运行时动态获取和操作类信息。核心方法涵盖类结构解析、实例化、字段/方法访问等场景,但在生产环境中需谨慎使用,权衡灵活性与性能、安全性的关系。