深入了解反射
newInstance
可访问性限制: newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数,那么newInstance()方法将无法使用。
异常处理: newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAccessException,需要在使用时进行相应的异常处理。这增加了代码的复杂性。
从Java 9开始,推荐使用更安全和更灵活的方式来创建类的实例,例如:
使用带有参数的构造函数:通过获取构造函数对象并调用newInstance()方法创建对象,可以传递所需的参数。这样可以处理具有不同构造函数的情况。
使用MethodHandle:MethodHandle提供了一种更底层的方式来调用构造函数,并且没有访问权限的限制。
B.class.isAssignableFrom(A.class) 判断Class A是否等于/继承/实现ClassB
@return the {@code boolean}
value indicating whether objects of the type {@code cls} can be assigned to objects of this class
指示对象是否属于类型{@code cls}可以分配给这个类的对象
@Testpublic void isAssignableFromTest() {System.out.println(SubInterFaceA.class.isAssignableFrom(SubInterFaceA.class));//trueSystem.out.println(SubInterFaceA.class.isAssignableFrom(InterFaceA.class));//falseSystem.out.println(SubInterFaceA.class.isAssignableFrom(SuperInterFaceA.class));//falseSystem.out.println(InterFaceA.class.isAssignableFrom(SubInterFaceA.class));//trueSystem.out.println(InterFaceA.class.isAssignableFrom(InterFaceA.class));//trueSystem.out.println(InterFaceA.class.isAssignableFrom(SuperInterFaceA.class));//falseSystem.out.println(SuperInterFaceA.class.isAssignableFrom(SubInterFaceA.class));//trueSystem.out.println(SuperInterFaceA.class.isAssignableFrom(InterFaceA.class));//trueSystem.out.println(SuperInterFaceA.class.isAssignableFrom(SuperInterFaceA.class));//true//同理System.out.println(SubClassA.class.isAssignableFrom(SubClassA.class));System.out.println(SubClassA.class.isAssignableFrom(ClassA.class));System.out.println(SubClassA.class.isAssignableFrom(SuperClassA.class));System.out.println(ClassA.class.isAssignableFrom(SubClassA.class));System.out.println(ClassA.class.isAssignableFrom(ClassA.class));System.out.println(ClassA.class.isAssignableFrom(SuperClassA.class));System.out.println(SuperClassA.class.isAssignableFrom(SubClassA.class));System.out.println(SuperClassA.class.isAssignableFrom(ClassA.class));System.out.println(SuperClassA.class.isAssignableFrom(SuperClassA.class));}
isInstance 判断类Class是否是参数对象本身或者父类
@return true
if {@code obj} is an instance of this class
如果{@code obj}是该类的实例,则返回true
@Testpublic void isInstanceTest() {SuperClassA subClassA = new SubClassA();SuperClassA classA = new ClassA();SuperClassA superClassA = new SuperClassA();//子类是可以向上转型的System.out.println(SubClassA.class.isInstance(subClassA));// trueSystem.out.println(ClassA.class.isInstance(subClassA));// trueSystem.out.println(SuperClassA.class.isInstance(subClassA));// true 可以是入参对象的父类System.out.println(SubClassA.class.isInstance(classA));//falseSystem.out.println(ClassA.class.isInstance(classA));// trueSystem.out.println(SuperClassA.class.isInstance(classA));// true 可以是入参对象的父类System.out.println(SubClassA.class.isInstance(superClassA));//falseSystem.out.println(ClassA.class.isInstance(superClassA));//falseSystem.out.println(SuperClassA.class.isInstance(superClassA));// trueSystem.out.println(SubClassA.class.isInstance(null));//falseSystem.out.println(ClassA.class.isInstance(null));//falseSystem.out.println(SuperClassA.class.isInstance(null));// false/*** instanceof :* java的一个二元运算符,也是一个关键字* 判断左边对象是否是右边类本身或者子类** A instanceof B:* A为对象实例(A只能为引用数据类型),B为类名* 注意左边只能为引用数据类型,否则会报错:* 向上转型(多态):*///classA= (ClassA)superClassA;//直接强转会抛出异常ClassCastExceptionif (superClassA instanceof ClassA) {//利用instanceof关键字就可以帮助我们判断向下转型是否正确,就可以规避一些转型错误的问题!classA = (ClassA) superClassA;} else {System.out.println(String.format("superClassA instanceof ClassA:{%s}", false));}classA = (ClassA) subClassA;superClassA = (SuperClassA) classA;subClassA = (SubClassA) superClassA;if (superClassA instanceof SubClassA) {subClassA = (SubClassA) superClassA;System.out.println(String.format("superClassA instanceof SubClassA:{%s}", true));} else {System.out.println(String.format("superClassA instanceof SubClassA:{%s}", false));}ArrayList arrayList = Lists.newArrayList();System.out.println(List.class.isInstance(arrayList));//trueSystem.out.println(List.class.isInstance(new Object()));//falseSystem.out.println(List.class.isInstance(new LinkedList<>()));//true//参数可以是基本类型 自动做了装箱操做System.out.println(Integer.class.isInstance(1));//trueSystem.out.println(Integer.class.isInstance(1.1));//falseSystem.out.println(Double.class.isInstance(1.6));//trueSystem.out.println(Double.class.isInstance(1));//false}
isPrimitive 当且仅当该类表示基本类型时
@return true
if and only if this class represents a primitive type
当且仅当该类表示基本类型时
@Testpublic void isPrimitiveTest() {System.out.println(boolean.class.isPrimitive());//trueSystem.out.println(char.class.isPrimitive());//trueSystem.out.println(byte.class.isPrimitive());//trueSystem.out.println(short.class.isPrimitive());//trueSystem.out.println(long.class.isPrimitive());//trueSystem.out.println(float.class.isPrimitive());//trueSystem.out.println(double.class.isPrimitive());//trueSystem.out.println(void.class.isPrimitive());//trueSystem.out.println(SubClassA.class.isPrimitive());//false}
isAnnotation 是否是一个注释类型
@return {@code true} if this class object represents an annotation type; {@code false} otherwise如果这个类对象表示一个注释类型;{@code false}否则
@Testpublic void isAnnotationTest() {System.out.println(Component.class.isAnnotation());//trueSystem.out.println(Autowired.class.isAnnotation());//trueSystem.out.println(SubClassA.class.isAnnotation());//false}
isSynthetic 是否是Java语言规范定义的合成类
@return {@code true} if and only if this class is a synthetic class as defined by the Java Language Specification.
当且仅当该类是Java语言规范定义的合成类时。
@Testpublic void isSyntheticTest() {//lambda在编译时生成匿名内部类,所以使用lambda属于我们的合成类System.out.println(((Consumer) (c) -> System.gc()).getClass().isSynthetic());System.out.println(((Supplier) System::nanoTime).getClass().isSynthetic());System.out.println(((Predicate) (p) -> Boolean.FALSE).getClass().isSynthetic());System.out.println(((Function) (f) -> "function").getClass().isSynthetic());System.out.println(((Runnable) new Runnable() {//自己写了一个匿名内部类,编译没有生成,所以它不是合成类@Overridepublic void run() {}}).getClass().isSynthetic());System.out.println(((Runnable) System::nanoTime).getClass().isSynthetic());}
字段中同理
private enum Ruben {
}
System.out.println(Ruben.class.getDeclaredField("$VALUES").isSynthetic());
//输出结果为true,我们知道枚举是在编译后会生成$VALUES字段,所以它是一个合成字段
getClassLoader 获取类加载器
类加载器参考链接: https://blog.csdn.net/weixin_56219549/article/details/121972757.
getTypeParameters
-
getTypeParameters方法返回的是TypeVariable对象的数组,Type Variable是表示类型参数的接
口,可以通过该接口获取类型参数的各种信息. -
getTypeParameters方法只能用于泛型类或泛型方法,对于非泛型类或方法,调用该方法会
返回-一个空数组. -
getTypeParameters方法返回的TypeVariable对象数组的顺序与类型参数在类或方法中的声明
顺序相同,可以通过数组的下标来获取具体的类型参数信息.
在使用getTypeParameters方法时,可以通过以下代码示例来获取泛型类或泛型方法的类型参书信息
@Testpublic void getTypeParameters() {TypeVariable<Class<TransOrderHandler>>[] typeParameters = TransOrderHandler.class.getTypeParameters();for (TypeVariable<Class<TransOrderHandler>> typeParameter : typeParameters) {System.out.println(typeParameter.getAnnotatedBounds());System.out.println(typeParameter.getBounds());System.out.println(typeParameter.getGenericDeclaration());System.out.println(typeParameter.getName());}Method[] methods = TransOrderHandler.class.getMethods();for (Method method : methods) {Parameter[] parameters = method.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter.getName());System.out.println(parameter.getDeclaringExecutable());System.out.println(parameter.getAnnotatedType());System.out.println(parameter.getType());System.out.println(parameter.getParameterizedType());}}}
getSuperclass or getGenericSuperclass
public class ClassB extends GenericClassB<SubClassA,ClassA> implements GenericInterfaceB<SubClassA,ClassA>, InterfaceB {@Overridepublic ClassA methodPublicAbstract(SubClassA subClassA) {return null;}@Overridepublic String methodPublicAbstract() {return null;}
}
@return the superclass of the class represented by this object.
由该对象表示的类的超类。
getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)
getGenericSuperclass 返回直接继承的父类(包含泛型参数)
@Testpublic <T extends BaseOrderVO, R> void getSuperclassTest() {Class<? super ClassB> superclass = ClassB.class.getSuperclass();System.out.println(superclass.getName());Type genericSuperclass = ClassB.class.getGenericSuperclass();System.out.println(genericSuperclass.getTypeName());if (genericSuperclass instanceof ParameterizedType) {Type[] types = ((ParameterizedType) genericSuperclass).getActualTypeArguments();for (Type type : types) {System.out.println(type.getTypeName());}}}
输出
getInterfaces or getGenericInterfaces
@return an array of interfaces implemented by this class
由这个类实现的接口数组
getInterfaces 返回由此对象表示的类或接口实现的接口。
Returns the {@code Type}s representing the interfaces directly implemented by the class or interface represented by this object.释意:返回表示由此对象表示的类或接口直接实现的接口的{@code Type}。
getGenericInterfaces 返回直接继承的接口(包含泛型参数)
@Testpublic void getInterfacesTest() {Class<?>[] Interfaces = ClassB.class.getInterfaces();Type[] genericInterfaces = ClassB.class.getGenericInterfaces();}
getPackage 包信息
@return the package of the class, or null if no package information is available from the archive or codebase.
类的包,如果存档或代码库中没有可用的包信息,则为空。
@Testpublic <T extends BaseOrderVO, R> void getPackageTest() {System.out.println(GenericClassB.class.getPackage());System.out.println(GenericInterfaceB.class.getPackage());}
输出
package com.buyan.entity.reflect
package com.buyan.entity.reflect.i
getComponentType 得到数组里的类型。
@return the {@code Class} representing the component type of this class if this class is an array
{@code Class}表示这个类的组件类型,如果这个类是一个数组
如果此类不表示数组类,则此方法返回null
@Testpublic void getComponentTypeTest() {List<Object> arrays = new ArrayList<>();arrays.add(new ClassA());arrays.add(new float[]{2l});arrays.add(new double[]{2.2});arrays.add(new int[]{1});arrays.forEach(v->System.out.println(v.getClass().getComponentType()));Object stringArray = Array.newInstance(String.class, 3);Array.set(stringArray, 0, "Mahesh");Array.set(stringArray, 1, "Ramesh");Array.set(stringArray, 2, "Suresh");System.out.println(stringArray.getClass().getComponentType());int[] dim = new int[] { 5, 10, 15 };Object array = Array.newInstance(Integer.TYPE, dim);Object arrayObj = Array.get(array, 3);Class<?> cls = arrayObj.getClass().getComponentType();System.out.println(cls);}
getModifiers 标识该类的修饰符
返回值说明
getModifiers()方法的返回值是一个整数,这个整数实际上是修饰符的位标志组合。Java使用位运算来高效地表示多个布尔属性,每个修饰符对应一个二进制位。这种方式允许通过一个整数同时表示多个修饰符状态。下面是常见的修饰符及其对应的位值:
@Testpublic void getModifiersTest() {/*** public: 0x0001(1)* private: 0x0002(2)* protected: 0x0004(4)* static: 0x0008(8)* final: 0x0010(16)* synchronized: 0x0020(32)* volatile: 0x0040(64) - 对于字段有效* transient: 0x0080(128) - 对于字段有效* native: 0x0100(256) - 对于方法有效* interface: 0x0200(512) - 对于类或接口有效* abstract: 0x0400(1024) - 对于类或方法有效* strictfp: 0x0800(2048) - 对于类或方法有效*/int modifiers = ReflectTest.class.getModifiers();System.out.println(Modifier.toString(modifiers) + " getModifiers: " + modifiers);modifiers = ProtectedClass.class.getModifiers();System.out.println(Modifier.toString(modifiers) + " getModifiers: " + modifiers);modifiers = DefaultClass.class.getModifiers();System.out.println(Modifier.toString(modifiers) + " getModifiers: " + modifiers);modifiers = PrivateClass.class.getModifiers();System.out.println(Modifier.toString(modifiers) + " getModifiers: " + modifiers);//例如,如果一个方法是private和static的,那么它的修饰符位标志将是0x0002(public)加上0x0008(static)。modifiers = PrivateStaticClass.class.getModifiers();System.out.println(Modifier.toString(modifiers) + " getModifiers: " + modifiers);}protected class ProtectedClass{}class DefaultClass{}private class PrivateClass{}private static class PrivateStaticClass{}
输出
getSigners 获取该类的签名者
@return the signers of this class, or null if there are no signers. In particular, this method returns null if this object represents a primitive type or void.
该类的签名者,如果没有签名者,则为空。特别是,如果此对象表示基本类型或void,则此方法返回null。
public native Object[] getSigners();
getEnclosingMethod、getEnclosingConstructor、getEnclosingClass
Enclosing : 封闭;围合(可以理解为直接外部类或最近的)
getEnclosingMethod
当此Class对象在方法内部表示本地或匿名类时,使用getEnclosingMethod()方法返回基础类的最新封闭方法
getEnclosingConstructor
表示底层类的直接封闭构造函数,如果此Class对象表示构造函数中的本地或匿名类,则返回null。
getEnclosingClass
方法返回底层类的直接封闭类。 如果该类是顶级类,则此方法返回 null。
public Object o;class InnerClass{class InnerInnerClass{}}public ReflectTest(){class InnerClass{} o = new InnerClass();}public Object method(){class InnerClass{} return new InnerClass();}private Object methodCopy(String str){class InnerClass{String fileStr; InnerClass(String str){this.fileStr=str;}} return new InnerClass(str);}@Testpublic void getEnclosingTest() {ReflectTest reflectTest = new ReflectTest();Class<?> clazz = reflectTest.o.getClass();Constructor<?> enclosingConstructor = reflectTest.o.getClass().getEnclosingConstructor();System.out.println(enclosingConstructor);System.out.println(reflectTest.method().getClass().getEnclosingMethod());System.out.println(reflectTest.methodCopy("").getClass().getEnclosingMethod());System.out.println(ReflectTest.InnerClass.InnerInnerClass.class.getEnclosingClass());}
输出
getDeclaringClass 获取对应类的声明类Class对象
public interface IService {void method();}public static class ServiceClassA {IService getIService() {//匿名内部类return new IService() {@Overridepublic void method() {System.out.println(this.getClass().getEnclosingClass());System.out.println(this.getClass().getDeclaringClass());}};}}public static class ServiceClassB {IService getIService() {//匿名内部类lambda写法return () -> {System.out.println(this.getClass().getEnclosingClass());System.out.println(this.getClass().getDeclaringClass());};}}@Testpublic void getDeclaringClassTest() {/*** 1、Class.GetEnclosingClass* <doc>获取对应类的直接外部类Class对象</doc>* 2、Class.GetDeclaringClass* <doc>获取对应类的声明类Class对象</doc>* 3、两者的区别* <p>* GetEnclosingClass与GetDeclaringClass很相近* 两者的区别在于匿名内部类、getEnclosingClass对匿名内部类也有效*/Class<InnerClass> innerClass = InnerClass.class;System.out.println(innerClass.getEnclosingClass().getName());System.out.println(innerClass.getDeclaringClass().getName());//注意:GetEnclosingClass获取的是直接定义该类的外部类Class实例、这点和getDeclaringClass一致Class<InnerClass.InnerInnerClass> innerInnerClassClass = InnerClass.InnerInnerClass.class;System.out.println(innerInnerClassClass.getEnclosingClass().getName());System.out.println(innerInnerClassClass.getDeclaringClass().getName());//针对匿名内部类的测试ServiceClassA serviceClassA = new ServiceClassA();IService iService = serviceClassA.getIService();iService.method();System.out.println(iService.getClass().getEnclosingClass());System.out.println(iService.getClass().getDeclaringClass());//针对匿名内部类lambda写法的测试ServiceClassB serviceClassB = new ServiceClassB();iService = serviceClassB.getIService();iService.method();System.out.println(iService.getClass().getEnclosingClass());System.out.println(iService.getClass().getDeclaringClass());}
输出
getDeclaringClasss 获取对应类的声明类Class类中的class
@Testpublic void getDeclaringClassTest() {Class<?>[] declaredClasses = ReflectTest.class.getDeclaredClasses();for (Class<?> declaredClass : declaredClasses) {System.out.println(declaredClass.getName());}}
输出
getName(),getSimpleName,getTypeName,getCanonicalName
参考连接https://blog.csdn.net/Goodbye_Youth/article/details/83536840.
@return the name of the class or interfacerepre sented by this object.
由该对象表示的类或接口的名称。
getName 如 [Ljava.lang.String;
@return the simple name of the underlying class
底层类的简单名称
getSimpleName String[]
@return an informative string for the name of this type
此类型名称的信息字符串
getTypeName 如 java.lang.String[]
@return the canonical name of the underlying class if it exists, and {@code null} otherwise.
如果存在,则为基础类的规范名称,否则为{@code null}。
getCanonicalName
@Testpublic void getNameTest() {// 普通类Class<?> clazz = ReflectTest.class;System.out.println(clazz.getName());System.out.println(clazz.getSimpleName());System.out.println(clazz.getCanonicalName());System.out.println(clazz.getTypeName());// 基本数据类型System.out.println(void.class.getName()); // intSystem.out.println(void.class.getCanonicalName()); // intSystem.out.println(void.class.getSimpleName()); // intSystem.out.println(void.class.getTypeName()); // int// 数组System.out.println(String[].class.getName()); // [Ljava.lang.String;System.out.println(String[].class.getCanonicalName()); // java.lang.String[]System.out.println(String[].class.getSimpleName()); // String[]System.out.println(String[].class.getTypeName()); // java.lang.String[]// 成员内部类System.out.println(InnerClass.class.getName()); System.out.println(InnerClass.class.getCanonicalName()); System.out.println(InnerClass.class.getSimpleName()); System.out.println(InnerClass.class.getTypeName()); //匿名内部类ServiceClassA serviceClassA = new ServiceClassA();clazz = serviceClassA.getIService().getClass();System.out.println(clazz.getName());System.out.println(clazz.getSimpleName());System.out.println(clazz.getCanonicalName());System.out.println(clazz.getTypeName());//匿名内部类lambdaServiceClassB serviceClassB = new ServiceClassB();clazz = serviceClassB.getIService().getClass();System.out.println(clazz.getName());System.out.println(clazz.getSimpleName());System.out.println(clazz.getCanonicalName());System.out.println(clazz.getTypeName());}
isAnonymousClass,isLocalClass,isMemberClass
@return {@code true} if and only if this class is an anonymous class.
当且仅当这个类是一个匿名类。
isAnonymousClass
@return {@code true} if and only if this class is a local class.
当且仅当这个类是一个局部类。
isLocalClass
@return {@code true} if and only if this class is a member class.
当且仅当这个类是一个成员类。
isMemberClass()
@Testpublic void isClassTest() {//匿名内部类ServiceClassA serviceClassA = new ServiceClassA();Class<?> clazz = serviceClassA.getIService().getClass();System.out.println(clazz.isAnonymousClass());//trueSystem.out.println(clazz.isLocalClass());//falseSystem.out.println(clazz.isMemberClass());//false//匿名内部类lambdaServiceClassB serviceClassB = new ServiceClassB();clazz = serviceClassB.getIService().getClass();System.out.println(clazz.isAnonymousClass());//falseSystem.out.println(clazz.isLocalClass());//falseSystem.out.println(clazz.isMemberClass());//false//成员类clazz = InnerClass.InnerInnerClass.class;System.out.println(clazz.isAnonymousClass());//falseSystem.out.println(clazz.isLocalClass());//falseSystem.out.println(clazz.isMemberClass());//trueclass AA {}//方法内局部类clazz = AA.class;System.out.println(clazz.isAnonymousClass());//falseSystem.out.println(clazz.isLocalClass());//trueSystem.out.println(clazz.isMemberClass());//false{class BB {}//块内局部类clazz = BB.class;System.out.println(clazz.isAnonymousClass());//falseSystem.out.println(clazz.isLocalClass());//trueSystem.out.println(clazz.isMemberClass());//false}}
getClasses(包括嵌套类、嵌套接口和枚举类型)
getClasses
获取某个类中所有公共类和接口的 Class 对象,这包括嵌套类、嵌套接口和枚举类型
getDeclaredClasses
获取某个类中声明的所有字段,包括公有、私有、受保护的类和接口的 Class 对象,这包括嵌套类、嵌套接口和枚举类型
@Testpublic void getClassesTest() {for (Class<?> aClass : ReflectTest.class.getClasses()) {System.out.println(aClass.getName());}System.out.println("------------------------");for (Class<?> aClass : ReflectTest.class.getDeclaredClasses()) {System.out.println(aClass.getName());}}
输出
同理
getFields
getMethods
getConstructors
getField
getMethod
getConstructor
不包括继承的字段和方法等,简单理解就是当前类的。
包括4重访问权限
getDeclaredFields
getDeclaredMethods
getDeclaredConstructors
getDeclaredField
getDeclaredMethod
getDeclaredConstructor
getResourceAsStream getResource
Class.getResourceAsStream(String path) :
path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从 ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
Class.getClassLoader.getResourceAsStream(String path) :
默认则是从ClassPath根下获取,path不能以’/'开头,最终是由 ClassLoader获取资源。
@Testpublic void getResourceTest() {URL resource = ReflectTest.class.getClassLoader().getResource("");System.out.println("根路径" + resource.getPath());resource = ReflectTest.class.getResource("");System.out.println("包路径" + resource.getPath());resource = ReflectTest.class.getResource("/");System.out.println("包路径" + resource.getPath());// 获取不到, 因为是相对于包路径URL resource1 = ReflectTest.class.getResource("application.yaml");// null// 下面3个能获取到, 因为是相对于classpath的路径URL resource2 = ReflectTest.class.getResource("/application.yaml");URL resource3 = ReflectTest.class.getClassLoader().getResource("application.yaml");URL resource4 = ReflectTest.class.getClassLoader().getResource("./application.yaml");// 获取不到,无法被解析为相对于classpath的路径URL resource5 = ReflectTest.class.getClassLoader().getResource("/application.yaml");//nullSystem.out.println(resource1); // nullSystem.out.println(resource2); // 非nullSystem.out.println(resource3); // 非nullSystem.out.println(resource4); // 非nullSystem.out.println(resource5); // null}
getProtectionDomain
@Testpublic void getProtectionDomainTest() {ProtectionDomain protectionDomain = ReflectTest.class.getProtectionDomain();System.out.println(protectionDomain);}
输出
desiredAssertionStatus 返回将分配给此类的断言状态。
@Testpublic void desiredAssertionStatusTest() {boolean b = ReflectTest.class.desiredAssertionStatus();System.out.println(b);}
输出
isEnum getEnumConstants
@return true if and only if this class was declared as an enum in the source code
当且仅当在源代码中将该类声明为enum时为True
isEnum
@return an array containing the values comprising the enum class represented by this Class object in the order they’re declared, or null if this Class object does not represent an enum type
一个数组,其中包含由这个class对象表示的枚举类的值,按照它们的声明顺序,如果这个class对象不表示枚举类型,则为空
getEnumConstants
@Testpublic void enumTest(){Class clazz = EnumValue.class;System.out.println(clazz.isEnum());for (Object enumConstant : clazz.getEnumConstants()) {System.out.println(enumConstant);}}
输出
cast 将对象强制转换为所表示的类或接口
Class.cast 主要用于以下情景:
在反射中,当需要通过反射获取对象实例并将其转换为特定类型时,Class.cast 可以用于安全地进行类型检查和转换。
在动态编程场景下,当无法在编译时确定类型,但又需要进行类型转换时,Class.cast 提供了一种可靠的转换方式。
@Testpublic void castTest(){ClassA classA = new ClassA();System.out.println(classA);SuperClassA superClassA = SuperClassA.class.cast(classA);System.out.println(superClassA);try {SubClassA subClassA = SubClassA.class.cast(classA);}catch (ClassCastException e){System.out.println("ClassCastException");}}
}
asSubclass
Casts this {@code Class} object to represent a subclass of the class represented by the specified class object. Checks that the cast is valid, and throws a {@code ClassCastException} if it is not. If this method succeeds, it always returns a reference to this class object.
强制转换这个{@code Class}对象来表示由指定的类对象表示的类的子类。检查强制转换是否有效,如果无效则抛出{@code ClassCastException}。如果这个方法成功,它总是返回对这个类对象的引用。
@Testpublic void asSubclassTest(){ClassA classA = new ClassA();System.out.println(classA);Class<? extends ClassA> aClass = SubClassA.class.asSubclass(classA.getClass());System.out.println(aClass);try {aClass = SuperClassA.class.asSubclass(classA.getClass());}catch (ClassCastException e){System.out.println("ClassCastException");}
getAnnotation
getAnnotation
isAnnotationPresent
1.getAnnotationsByType方法只能获取直接应用在元素上的注解,无法获取间接应用的注解。例如,如果类A应用了注解B,类B应用了注解C,那么通过
2.getAnnotationsByType方法只能获取由源代码中的注解声明而来的注解,无法获取由框架或工具生成的注解。这意味着,如果某个注解是在运行时由框架或工具生成的,那么getAnnotationsByType方法无法获取到该注解。
getAnnotationsByType
getAnnotations
getDeclaredAnnotation
getDeclaredAnnotationsByType
getDeclaredAnnotations
getAnnotatedSuperclass
getAnnotatedInteces
@Testpublic void annotationTest () {Class<?> clazz = Configuration.class;System.out.println(clazz.isAnnotation());System.out.println(clazz.isAnnotationPresent(Component.class));System.out.println(clazz.isAnnotationPresent(Ann.class));System.out.println(clazz.getAnnotationsByType(Component.class));System.out.println(Ann.class.getAnnotationsByType(ComponentScan.Filter.class));for (Annotation annotation : clazz.getAnnotations()) {System.out.println(annotation);}System.out.println("------"+"getDeclaredAnnotations"+"------");for (Annotation annotation : clazz.getDeclaredAnnotations()) {System.out.println(annotation);}System.out.println("------"+"getDeclaredAnnotation"+"------");Component declaredAnnotation = clazz.getDeclaredAnnotation(Component.class);System.out.println(declaredAnnotation);System.out.println("------"+"getAnnotatedSuperclass"+"------");AnnotatedType annotatedSuperclass = clazz.getAnnotatedSuperclass();System.out.println(annotatedSuperclass);annotatedSuperclass = ClassB.class.getAnnotatedSuperclass();System.out.println(annotatedSuperclass);System.out.println("------"+"getAnnotatedInterfaces"+"------");AnnotatedType[] annotatedInterfaces = ClassB.class.getAnnotatedInterfaces();for (AnnotatedType annotatedInterface : annotatedInterfaces) {System.out.println(annotatedInterface);}}
相关文章:
深入了解反射
newInstance 可访问性限制: newInstance()方法只能调用无参的公共构造函数。如果类没有无参公共构造函数,那么newInstance()方法将无法使用。 异常处理: newInstance()方法在创建对象时会抛出受检异常InstantiationException和IllegalAcces…...
5、搭建前端项目
5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…...
LLM之Agent初探
Agent是什么? Agent一词起源于拉丁语中的Agere,意思是“to do”。在LLM语境下,Agent可以理解为在某种能自主理解、规划决策、执行复杂任务的智能体。 Agent并非ChatGPT升级版,它不仅告诉你“如何做”,更会帮你去做。…...
目录穿越漏洞CVE-2018-7171复现 又学到一招小技巧!!!!
还是半夜睡不着,打开靶机开始操作。今天看了文件下载和目录穿越漏洞想结合以及防御方法。半夜来进行操作一波。复现一下漏洞,这个网上的文章页比较的少!!! 开始操作起来!!! 进入到页…...
代码随想录算法训练营day41
题目:01背包理论基础、416. 分割等和子集 参考链接:代码随想录 动态规划:01背包理论基础 思路:01背包是所有背包问题的基础,第一次看到比较懵,完全不知道dp数据怎么设置。具体分析还是dp五部曲ÿ…...
从0~1开发财务软件
1.获取图形验证码接口 功能要求 1、随机生成6位字符 2、将字符生成base64位格式的图片,返回给前端 3、将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。 clientId通过/login/getClien…...
Python实现连连看9
(2)标识选中的图片 在判断出玩家选中的是哪一张图片之后,接下来就可以标识选中的图片了,即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…...
项目验收总体计划书(实际项目验收原件参考Word)
测试目标:确保项目的需求分析说明书中的所有功能需求都已实现,且能正常运行;确保项目的业务流程符合用户和产品设计要求;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 ࿰…...
C++基础与深度解析 | 异常处理 | 枚举与联合 | 嵌套类与局部类 | 嵌套名字空间与匿名名字空间 | 位域与volatile关键字
文章目录 一、异常处理二、枚举与联合三、嵌套类与局部类四、嵌套名字空间与匿名名字空间五、位域与volatile关键字 一、异常处理 异常处理用于处理程序在调用过程中的非正常行为。 传统的处理方法:传返回值表示函数调用是否正常结束。 例如,返回 0 表示…...
番外篇 | 利用华为2023最新Gold-YOLO中的Gatherand-Distribute对特征融合模块进行改进
前言:Hello大家好,我是小哥谈。论文提出一种改进的信息融合机制Gather-and-Distribute (GD) ,通过全局融合多层特征并将全局信息注入高层,以提高YOLO系列模型的信息融合能力和检测性能。通过引入MAE-style预训练方法,进一步提高模型的准确性。🌈 目录 🚀1.论文解…...
python记录之字符串
在Python中,字符串是一种非常常见且重要的数据类型,用于存储文本信息。下面,我们将对Python字符串进行深入的讲解,包括其基本操作、常见方法、格式化以及高级特性。 1. 字符串的创建 在Python中,字符串可以通过单引号…...
Elasticsearch 认证模拟题 - 15
一、题目 原索引 task1 的字段 title 字段包含单词 The,查询 the 可以查出 1200 篇文档。重建 task1 索引为 task1_new,重建后的索引, title 字段查询 the 单词,不能匹配到任何文档。 PUT task1 {"mappings": {"…...
g++ 预处理 编译 汇编 链接 命令
g 预处理 编译 汇编 链接 命令 在命令行中使用 g 预处理、编译、汇编和链接源代码文件通常遵循以下步骤: 预处理(Preprocessing):将源代码文件转换为经过预处理器处理的中间文件。 g -E source.cpp -o source.i 编译ÿ…...
计算机视觉中的low-level与 high-level任务
文章目录 low-level任务high-level任务区别联系others参考在计算机视觉领域中,low-level任务和high-level任务是两个重要的概念,他们分别涉及图像处理和分析的不同的层次。 low-level任务 low-level任务主要关注的是图像的底层特征,如颜色、纹理、边缘、形状等。通常涉及对…...
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑
安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑 时间的流逝自古以来时钟都是人类生活与活动的基础。然而,随着科技的进步,我们对时间管理和测量的方法已经发生了翻天覆地的变…...
图论第8天
685.冗余连接II 这题需要考虑两种情况: 1.两个输入 2.没有两个输入就是有成环 class Solution { public:static const int N 1005;int father[N];int n;void init(){for (int i 0; i < n; i){father[i] i;}}int find(int x){return x father[x] ? x : f…...
Python怎么配置环境变量:深度探索与实战指南
Python怎么配置环境变量:深度探索与实战指南 在Python编程的世界中,环境变量的配置是一个至关重要的步骤。它不仅影响着Python解释器的运行,还关系到各种第三方库和工具的使用。本文将带你深度探索如何配置Python的环境变量,并为…...
计网期末复习指南(六):应用层(DNS、FTP、URL、HTTP、SMTP、POP3)
前言:本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点,从计算机网络体系结构出发到应用层,每一个协议层通过一篇文章进行总结,本系列正在持续更新中... 计网期末复习指南(一):计算…...
HTML做成一个炫酷跳动爱心的页面
大家好,今天制作制作一个炫酷跳动爱心的页面! 先看具体效果: 要创建一个炫酷跳动爱心的HTML页面,你可以使用HTML、CSS和JavaScript的组合。以下是一个简单的示例,它使用CSS动画和JavaScript来实现跳动效果。 首先&…...
React + SpringBoot实现图片预览和视频在线播放,其中视频实现切片保存和分段播放
图片预览和视频在线播放 需求描述 实现播放视频的需求时,往往是前端直接加载一个mp4文件,这样做法在遇到视频文件较大时,容易造成卡顿,不能及时加载出来。我们可以将视频进行切片,然后分段加载。播放一点加载一点&am…...
Suse Linux ssh配置免密后仍需要输入密码
【问题描述】 Suse Linux已经配置了ssh免密,但无法ssh到目标服务器。 对自身的ssh登陆也需要输入密码。 系统–Suse 15 SP5 【重现步骤】 1.使用ssh-keygen -t rsa生产key文件 2.使用ssh-copy-id拷贝public key到目标机器(或者自身) 3.配置成功后ssh 目标时仍需要输…...
apifox 生成签名
目录 前言准备编写签名脚本签名说明捋清思路编码获取签名所需的参数生成签名将签名放到合适的位置完整代码 在apifox中配置脚本新增公共脚本引用公共脚本添加环境变量 参考 前言 略 准备 查看apifox提供的最佳实践文章:接口签名如何处理 编写签名脚本 签名说明…...
介绍建造者模式
建造者模式 将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示 四种角色 Product 产品角色 指的是一个具体的产品对象Builder 抽象建造者 创建一个产品对象的各个部件的接口/抽象类ConcreteBuilder 具体建造者 实现或继承抽象建造者接口…...
【全部更新完毕】2024全国大学生数据统计与分析竞赛B题思路代码文章教学数学建模-电信银行卡诈骗的数据分析
电信银行卡诈骗的数据分析 摘要 电信银行卡诈骗是当前社会中严重的犯罪问题,分析电信银行卡交易数据,找出高风险交易特征,建立预测模型,将有助于公安部门和金融机构更好地防范诈骗行为,保障用户的财产安全。 针对问…...
【应用浅谈】Odoo的库存计价与产品成本(三)
序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo的库存(Stock)模块拥有众多功能,其中库存计价是一项非常重要的功能,原生的成本方法分三种:【标准成本】,【平均成本】,【先进先出】&#…...
数据结构之ArrayList与顺序表(下)
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏:数据结构(Java版) 目录 ArrayList的具体使用 118. 杨辉三角 扑克洗牌算法 接上篇:数据结构之ArrayLis…...
openi启智社区 aarch64 npu环境安装飞桨paddlepaddle和PaddleNLP(失败)
以前在启智社区都是编译安装飞桨,这回看到飞桨提供了npu安装包,兴冲冲的以为安装很简单。 之所以安装飞桨,是因为想在启智社区的启智大脑调试环境使用最新的PaddleNLP,结果报错:No module named paddle.nn.layer.laye…...
【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞
0x01 产品简介 多客圈子论坛系统是一种面向特定人群或特定话题的社交网络,它提供了用户之间交流、分享、讨论的平台。在这个系统中,用户可以创建、加入不同的圈子,圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、…...
46-1 护网溯源 - 钓鱼邮件溯源
一、客户提供钓鱼邮件样本 二、行为分析 三、样本分析 对钓鱼邮件中的木马程序1111.exe文件进行了分析,提交了360安全大脑沙箱云和微步在线云沙箱。 360安全大脑沙箱云显示,该1111.exe文件存在危险,因此在解压时需要谨慎操作,以免触发木马程序。 建议使用360压缩软件进行…...
鸿蒙低代码开发一个高频问题
在版本是DevEco Studio 3.1.1 Release,SDK是3.1.0(API9)。 创建和设计的visual文件经常会遇到无法渲染的情况,或者自定义组件在Custom列表中突然不见了的情况。 有以下报错信息的: JSON schema validation error: data/visualModel/value/…...
个人网站icp备案网/百度一下点击搜索
题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴。 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同…...
wordpress twenty six/百度sem代运营
spinlock设计成了三层,第一层是接口,第二层raw实现层,第三层是CPU平台层。在第二层raw实现层提供了两个分支,分别是单CPU和多CPU(核)。第三层是不同CPU的锁操作实现。raw层除了调用锁操作来保护临界资源外&…...
如何在阿里巴巴建设网站/免费b站推广网站入口2020
名称 case - 跳转标记,在switch段内开启一个分支。 用法 case( : : Constant : ) 描述 case定义了一个switch段的跳转标记。 如果switch语句的控制表达式的值与Constant中定义的常量整数表达式相匹配,它将执行分支的内容。 对于这个参数,只接…...
江苏省建设厅网站/外贸推广优化公司
题意: 给出1000个数 任取三个数 求max(aiaj) xor ak 思路: 先计算出1e6个 ai aj 将这1e3个数转化为2进制建树。由于数值小于1e9,树深小于32。 将1e6个 ai aj 也转化为二进制,与trie树做抑或匹配。 每次匹配时先删除ai aj 所…...
专业网站建设搭建/广州市口碑seo推广
打印机用久了难免会出现故障,在打印过程中可能会遇到各种各样的迷惑行为,比如:打印乱码、条纹、黑点、阴影等。今天小编就来给大家说说激光打印机的迷惑行为:打印一半如何解决。原图打印一半01检查打印机 检查打印机查看是否是打印…...
商城网站备案能通过吗/网页关键词优化软件
lpad函数从左边对字符串使用指定的字符进行填充基本语法:lpad( string, padded_length, [ pad_string ] )string:准备被填充的字符串padded_length:填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比…...