Java Reflection 实战 - Class
Java 反射使得在运行时检查类、接口、字段和方法成为可能,而不需要在编译时知道类、方法等的名称。也可以使用反射来实例化新对象、调用方法和获取/设置字段值。
Java反射的功能相当强大,可以说是非常有用。例如,Java反射可以用来将JSON文件中的属性映射到Java对象中的getter/setter方法,就像Jackson, GSON, Boon等所做的那样。或者,反射可以用来将JDBC结果集的列名映射到Java对象中的getter/setter方法。本教程基于Java 17中的Java Reflection版本来演示。
Java Reflection - Classes
Class 类介绍
通过Java relection 来获取类信息,一般我们获取类的有用信息有如下这些
- Class Name
- Class Modifies (public, private, synchronized etc.)
- Package Info
- Superclass
- Implemented Interfaces
- Constructors
- Methods
- Fields
- Annotations
Class 常用方法如下:
demo
- Class Name
获取Class 名,getName() 获取包含包信息的,getSimpleName() 只返回类名称
Class<String> aClass = String.class;
String className = aClass.getName(); // java.lang.String
String simpleName = aClass.getSimpleName(); //String
- Modifiers
获取类的访问限定修饰符(public", “private”, "static”,“final”等),getModifiers()返回一个int类型
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
System.out.println(stringClass.getName());
System.out.println(stringClass.getSimpleName());
System.out.println(stringClass.getModifiers()); //17 = public(0x0001) + final(0x0010)
}
- Package Info
获取package 信息 ,getPackage() 返回值一个Package 对象和getPackageName() 返回值一个string类型
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
System.out.println(stringClass.getPackage()); //package java.lang
System.out.println(stringClass.getPackageName());//java.lang
}
- Superclass
获取父类,只能获取当前类的父类。
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
System.out.println(stringClass.getSuperclass());//class java.lang.Object
}
- Implemented Interfaces
获取实现的接口,只能获取当前类的实现接口
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
Stream.of(stringClass.getInterfaces()).forEach(System.out::println);
}
输出信息:
interface java.io.Serializable
interface java.lang.Comparable
interface java.lang.CharSequence
interface java.lang.constant.Constable
interface java.lang.constant.ConstantDesc
- Constructors
获取构造器
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
Stream.of(stringClass.getConstructors()).forEach(System.out::println);
}
输出信息:
public java.lang.String(java.lang.StringBuffer)
public java.lang.String(java.lang.StringBuilder)
public java.lang.String(byte[],int,int,java.nio.charset.Charset)
public java.lang.String(byte[],java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],java.nio.charset.Charset)
public java.lang.String(byte[],int,int)
public java.lang.String(byte[])
public java.lang.String(char[],int,int)
public java.lang.String(char[])
public java.lang.String(java.lang.String)
public java.lang.String()
public java.lang.String(byte[],int,int,java.lang.String) throws java.io.UnsupportedEncodingException
public java.lang.String(byte[],int)
public java.lang.String(byte[],int,int,int)
public java.lang.String(int[],int,int)
- Methods
获取类的方法
getMethods() 获取类所有public 方法(不包含构造器
);
getDeclaredMethods() 获取当前类的所有声明的方法(不管是public,private,static,protected
)
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
Stream.of(stringClass.getDeclaredMethods()).forEach(System.out::println);
Stream.of(stringClass.getMethods()).forEach(System.out::println);
}
- Fields
获取当前类所有的字段
getFields() 获取类所有public 字段;
getDeclaredFields() 获取当前类的所有声明的字段(不管是public,private,static,protected
)
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
Stream.of(stringClass.getFields()).forEach(System.out::println);
Stream.of(stringClass.getDeclaredFields()).forEach(System.out::println);
}
- Annotations
获取类上面的注解
getAnnotations() 获取当前类及父类的注解信息
getDeclaredAnnotations() 获取当前类的注解信息
public static void main(String[] args) throws IOException {
Class<String> stringClass = String.class;
Stream.of(stringClass.getAnnotations()).forEach(System.out::println);
Stream.of(stringClass.getDeclaredAnnotations()).forEach(System.out::println);
}