Package org.miaixz.bus.core.xyz
Class ReflectKit
java.lang.Object
org.miaixz.bus.core.xyz.ReflectKit
反射相关工具类
本工具类进行了重构,大部分被移动到了FieldKit、MethodKit、ModifierKit等中,
其他相关方法请参考org.miaixz.bus.core.lang.reflect包下的类,相关类
- 反射修改属性
ReflectKit#setFieldValue(Object, String, Object)--pFieldKit.setFieldValue(Object, String, Object)- 修改private修饰可被外部访问
ReflectKit.setAccessible(ReflectKit.getMethodByName(Xxx.class, "xxxMethodName"))--psetAccessible(AccessibleObject)--pMethodKit.getMethodByName(Class, String)- 移除final属性
ReflectKit.removeFinalModify(Field)--pModifierKit.removeFinalModify(Field)
在字节码中,类型表示如下:
- byte = B
- char = C
- double = D
- long = J
- short = S
- boolean = Z
- void = V
- 对象类型以“L”开头,“;”结尾,如Ljava/lang/Object;
- 数组类型,每一位使用一个前置的[字符来描述,如:java.lang.String[][] = [[Ljava/lang/String;
此类旨在通过类描述信息和类名查找对应的类,如动态加载类等
- Since:
- Java 17+
- Author:
- Kimi Liu
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final charboolean(Z).static final charbyte(B).static final charchar(C).static final chardouble(D).static final charfloat(F).static final charint(I).static final charlong(J).static final charshort(S).static final charvoid(V). -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic Class<?> descToClass(String desc) Class描述转Classstatic Class<?> descToClass(String desc, boolean isInitialized, ClassLoader cl) Class描述转Classstatic StringdescToName(String desc) 类描述转名称static StringgetCodeBase(Class<?> clazz) 获取code basestatic <T> Constructor<T> getConstructor(Class<T> clazz, Class<?>... parameterTypes) 查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为truestatic <T> Constructor<T>[]getConstructors(Class<T> beanClass) 获得一个类中所有构造列表static Constructor<?>[]getConstructorsDirectly(Class<?> beanClass) 获得一个类中所有构造列表,直接反射获取,无缓存static String获取类描述,这是编译成class文件后的二进制名称static StringgetDesc(Executable methodOrConstructor, boolean appendName) 获取方法或构造描述 方法(appendName为true):static String获得类名称 数组输出xxx[]形式,其它类调用Class.getName()static StringgetName(Executable executable) 获取构造或方法的名称表示 构造:static Class<?> nameToClass(String name, boolean isInitialized, ClassLoader cl) 类名称转类static StringnameToDesc(String name) 类名称转描述static <T> TnewInstance(Class<T> clazz, Object... params) 实例化对象static <T> TnewInstance(String clazz) 实例化对象 类必须有空构造函数static <T> TnewInstanceIfPossible(Class<T> type) 尝试遍历并调用此类的所有构造方法,直到构造成功并返回 对于某些特殊的接口,按照其默认实现实例化,例如:static <T extends AccessibleObject>
TsetAccessible(T accessibleObject) 设置方法为可访问(私有方法可以被外部调用) 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数static <T extends AccessibleObject>
TsetAccessibleQuietly(T accessibleObject) 设置方法为可访问(私有方法可以被外部调用),静默调用,抛出异常则跳过 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数
-
Field Details
-
JVM_VOID
public static final char JVM_VOIDvoid(V).- See Also:
-
JVM_BOOLEAN
public static final char JVM_BOOLEANboolean(Z).- See Also:
-
JVM_BYTE
public static final char JVM_BYTEbyte(B).- See Also:
-
JVM_CHAR
public static final char JVM_CHARchar(C).- See Also:
-
JVM_DOUBLE
public static final char JVM_DOUBLEdouble(D).- See Also:
-
JVM_FLOAT
public static final char JVM_FLOATfloat(F).- See Also:
-
JVM_INT
public static final char JVM_INTint(I).- See Also:
-
JVM_LONG
public static final char JVM_LONGlong(J).- See Also:
-
JVM_SHORT
public static final char JVM_SHORTshort(S).- See Also:
-
-
Constructor Details
-
ReflectKit
public ReflectKit()
-
-
Method Details
-
descToClass
Class描述转Class"[Z" => boolean[].class "[[Ljava/util/Map;" => java.util.Map[][].class- Parameters:
desc- 类描述- Returns:
- Class
- Throws:
InternalException- 类没有找到
-
descToClass
public static Class<?> descToClass(String desc, boolean isInitialized, ClassLoader cl) throws InternalException Class描述转Class"[Z" => boolean[].class "[[Ljava/util/Map;" => java.util.Map[][].class- Parameters:
desc- 类描述isInitialized- 是否初始化类cl-ClassLoader- Returns:
- Class
- Throws:
InternalException- 类没有找到
-
getDesc
获取类描述,这是编译成class文件后的二进制名称getDesc(boolean.class) // Z getDesc(Boolean.class) // Ljava/lang/Boolean; getDesc(double[][][].class) // [[[D getDesc(int.class) // I getDesc(Integer.class) // Ljava/lang/Integer;- Parameters:
c- class.- Returns:
- desc.
-
getDesc
获取方法或构造描述 方法(appendName为true):
构造:int do(int arg1) => "do(I)I" void do(String arg1,boolean arg2) => "do(Ljava/lang/String;Z)V""()V", "(Ljava/lang/String;I)V"当appendName为
false时:getDesc(Object.class.getMethod("hashCode")) // ()I getDesc(Object.class.getMethod("toString")) // ()Ljava/lang/String; getDesc(Object.class.getMethod("equals", Object.class)) // (Ljava/lang/Object;)Z getDesc(ArrayKit.class.getMethod("isEmpty", Object[].class)) // "([Ljava/lang/Object;)Z"- Parameters:
methodOrConstructor- 方法或构造appendName- 是否包含方法名称- Returns:
- 描述
-
getName
获得类名称 数组输出xxx[]形式,其它类调用Class.getName()java.lang.Object[][].class => "java.lang.Object[][]"- Parameters:
c- 类- Returns:
- 类名称
-
getName
获取构造或方法的名称表示 构造:"()", "(java.lang.String,int)"
方法:
"void do(int)", "void do()", "int do(java.lang.String,boolean)"- Parameters:
executable- 方法或构造- Returns:
- 名称
-
nameToClass
类名称转类"boolean" => boolean.class "java.util.Map[][]" => java.util.Map[][].class- Parameters:
name- name.isInitialized- 是否初始化类cl- ClassLoader instance.- Returns:
- Class instance.
-
nameToDesc
类名称转描述java.util.Map[][] => "[[Ljava/util/Map;"- Parameters:
name- 名称- Returns:
- 描述
-
descToName
类描述转名称"[[I" => "int[][]"- Parameters:
desc- 描述- Returns:
- 名称
-
getCodeBase
获取code base- Parameters:
clazz- 类- Returns:
- code base
-
setAccessibleQuietly
设置方法为可访问(私有方法可以被外部调用),静默调用,抛出异常则跳过 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数- Type Parameters:
T- AccessibleObject的子类,比如Class、Method、Field等- Parameters:
accessibleObject- 可设置访问权限的对象,比如Class、Method、Field等- Returns:
- 被设置可访问的对象
- Throws:
SecurityException- 访问被禁止抛出此异常
-
setAccessible
public static <T extends AccessibleObject> T setAccessible(T accessibleObject) throws SecurityException 设置方法为可访问(私有方法可以被外部调用) 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数- Type Parameters:
T- AccessibleObject的子类,比如Class、Method、Field等- Parameters:
accessibleObject- 可设置访问权限的对象,比如Class、Method、Field等- Returns:
- 被设置可访问的对象
- Throws:
SecurityException- 访问被禁止抛出此异常
-
getConstructor
查找类中的指定参数的构造方法,如果找到构造方法,会自动设置可访问为true- Type Parameters:
T- 对象类型- Parameters:
clazz- 类parameterTypes- 参数类型,只要任何一个参数是指定参数的父类或接口或相等即可,此参数可以不传- Returns:
- 构造方法,如果未找到返回null
-
getConstructors
获得一个类中所有构造列表- Type Parameters:
T- 构造的对象类型- Parameters:
beanClass- 类,非null- Returns:
- 字段列表
- Throws:
SecurityException- 安全检查异常
-
getConstructorsDirectly
获得一个类中所有构造列表,直接反射获取,无缓存- Parameters:
beanClass- 类- Returns:
- 字段列表
- Throws:
SecurityException- 安全检查异常
-
newInstance
实例化对象 类必须有空构造函数- Type Parameters:
T- 对象类型- Parameters:
clazz- 类名- Returns:
- 对象
- Throws:
InternalException- 包装各类异常
-
newInstance
实例化对象- Type Parameters:
T- 对象类型- Parameters:
clazz- 类params- 构造函数参数- Returns:
- 对象
- Throws:
InternalException- 包装各类异常
-
newInstanceIfPossible
尝试遍历并调用此类的所有构造方法,直到构造成功并返回 对于某些特殊的接口,按照其默认实现实例化,例如:Map - HashMap Collction - ArrayList List - ArrayList Set - HashSet- Type Parameters:
T- 对象类型- Parameters:
type- 被构造的类- Returns:
- 构造后的对象,构造失败返回
null
-