深入了解反射

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}可以分配给这个类的对象

    @Test
    public void isAssignableFromTest() {
        System.out.println(SubInterFaceA.class.isAssignableFrom(SubInterFaceA.class));//true
        System.out.println(SubInterFaceA.class.isAssignableFrom(InterFaceA.class));//false
        System.out.println(SubInterFaceA.class.isAssignableFrom(SuperInterFaceA.class));//false
        System.out.println(InterFaceA.class.isAssignableFrom(SubInterFaceA.class));//true
        System.out.println(InterFaceA.class.isAssignableFrom(InterFaceA.class));//true
        System.out.println(InterFaceA.class.isAssignableFrom(SuperInterFaceA.class));//false
        System.out.println(SuperInterFaceA.class.isAssignableFrom(SubInterFaceA.class));//true
        System.out.println(SuperInterFaceA.class.isAssignableFrom(InterFaceA.class));//true
        System.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

    @Test
    public void isInstanceTest() {
        SuperClassA subClassA = new SubClassA();
        SuperClassA classA = new ClassA();
        SuperClassA superClassA = new SuperClassA();
        //子类是可以向上转型的
        System.out.println(SubClassA.class.isInstance(subClassA));// true
        System.out.println(ClassA.class.isInstance(subClassA));// true
        System.out.println(SuperClassA.class.isInstance(subClassA));// true 可以是入参对象的父类
        System.out.println(SubClassA.class.isInstance(classA));//false
        System.out.println(ClassA.class.isInstance(classA));// true
        System.out.println(SuperClassA.class.isInstance(classA));// true 可以是入参对象的父类
        System.out.println(SubClassA.class.isInstance(superClassA));//false
        System.out.println(ClassA.class.isInstance(superClassA));//false
        System.out.println(SuperClassA.class.isInstance(superClassA));// true
        System.out.println(SubClassA.class.isInstance(null));//false
        System.out.println(ClassA.class.isInstance(null));//false
        System.out.println(SuperClassA.class.isInstance(null));// false
        
        /**
         * instanceof :
         * java的一个二元运算符,也是一个关键字
         * 判断左边对象是否是右边类本身或者子类
         *
         * A instanceof B:
         * A为对象实例(A只能为引用数据类型),B为类名
         * 注意左边只能为引用数据类型,否则会报错:
         * 向上转型(多态):
         */
        //classA= (ClassA)superClassA;//直接强转会抛出异常ClassCastException
        if (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));//true
        System.out.println(List.class.isInstance(new Object()));//false
        System.out.println(List.class.isInstance(new LinkedList<>()));//true

        //参数可以是基本类型 自动做了装箱操做
        System.out.println(Integer.class.isInstance(1));//true
        System.out.println(Integer.class.isInstance(1.1));//false

        System.out.println(Double.class.isInstance(1.6));//true
        System.out.println(Double.class.isInstance(1));//false
    }

isPrimitive 当且仅当该类表示基本类型时

@return true
if and only if this class represents a primitive type
当且仅当该类表示基本类型时

    @Test
    public void isPrimitiveTest() {
        System.out.println(boolean.class.isPrimitive());//true
        System.out.println(char.class.isPrimitive());//true
        System.out.println(byte.class.isPrimitive());//true
        System.out.println(short.class.isPrimitive());//true
        System.out.println(long.class.isPrimitive());//true
        System.out.println(float.class.isPrimitive());//true
        System.out.println(double.class.isPrimitive());//true
        System.out.println(void.class.isPrimitive());//true
        System.out.println(SubClassA.class.isPrimitive());//false
    }

isAnnotation 是否是一个注释类型

 @return {@code true} if this class object represents an annotation   type; {@code false} otherwise
 如果这个类对象表示一个注释类型;{@code false}否则
    @Test
    public void isAnnotationTest() {
        System.out.println(Component.class.isAnnotation());//true
        System.out.println(Autowired.class.isAnnotation());//true
        System.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语言规范定义的合成类时。

    @Test
    public 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() {//自己写了一个匿名内部类,编译没有生成,所以它不是合成类
            @Override
            public 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

  1. getTypeParameters方法返回的是TypeVariable对象的数组,Type Variable是表示类型参数的接
    口,可以通过该接口获取类型参数的各种信息.

  2. getTypeParameters方法只能用于泛型类或泛型方法,对于非泛型类或方法,调用该方法会
    返回-一个空数组.

  3. getTypeParameters方法返回的TypeVariable对象数组的顺序与类型参数在类或方法中的声明
    顺序相同,可以通过数组的下标来获取具体的类型参数信息.

在使用getTypeParameters方法时,可以通过以下代码示例来获取泛型类或泛型方法的类型参书信息
在这里插入图片描述

    @Test
    public 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 {

    @Override
    public ClassA methodPublicAbstract(SubClassA subClassA) {
        return null;
    }

    @Override
    public String methodPublicAbstract() {
        return null;
    }
}

@return the superclass of the class represented by this object.
由该对象表示的类的超类。
getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)
getGenericSuperclass 返回直接继承的父类(包含泛型参数)

    @Test
    public <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 返回直接继承的接口(包含泛型参数)

    @Test
    public 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.
类的包,如果存档或代码库中没有可用的包信息,则为空。

   @Test
    public <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

  @Test
    public 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使用位运算来高效地表示多个布尔属性,每个修饰符对应一个二进制位。这种方式允许通过一个整数同时表示多个修饰符状态。下面是常见的修饰符及其对应的位值:

    @Test
    public 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);}
    @Test
    public 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() {
                @Override
                public 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());
            };
        }
    }

    @Test
    public 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

在这里插入图片描述

    @Test
    public 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

    @Test
    public 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()); // int
        System.out.println(void.class.getCanonicalName()); // int
        System.out.println(void.class.getSimpleName()); // int
        System.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());

        //匿名内部类lambda
        ServiceClassB 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()

    @Test
    public void isClassTest() {
        //匿名内部类
        ServiceClassA serviceClassA = new ServiceClassA();
        Class<?> clazz = serviceClassA.getIService().getClass();
        System.out.println(clazz.isAnonymousClass());//true
        System.out.println(clazz.isLocalClass());//false
        System.out.println(clazz.isMemberClass());//false

        //匿名内部类lambda
        ServiceClassB serviceClassB = new ServiceClassB();
        clazz = serviceClassB.getIService().getClass();
        System.out.println(clazz.isAnonymousClass());//false
        System.out.println(clazz.isLocalClass());//false
        System.out.println(clazz.isMemberClass());//false

        //成员类
        clazz = InnerClass.InnerInnerClass.class;
        System.out.println(clazz.isAnonymousClass());//false
        System.out.println(clazz.isLocalClass());//false
        System.out.println(clazz.isMemberClass());//true

        class AA {
        }//方法内局部类
        clazz = AA.class;
        System.out.println(clazz.isAnonymousClass());//false
        System.out.println(clazz.isLocalClass());//true
        System.out.println(clazz.isMemberClass());//false
        {class   BB {}//块内局部类
            clazz = BB.class;
            System.out.println(clazz.isAnonymousClass());//false
            System.out.println(clazz.isLocalClass());//true
            System.out.println(clazz.isMemberClass());//false
        }
    }

getClasses(包括嵌套类、嵌套接口和枚举类型)

getClasses
获取某个类中所有公共类和接口的 Class 对象,这包括嵌套类、嵌套接口和枚举类型
getDeclaredClasses
获取某个类中声明的所有字段,包括公有、私有、受保护的类和接口的 Class 对象,这包括嵌套类、嵌套接口和枚举类型

    @Test
    public 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获取资源。
在这里插入图片描述

   @Test
    public 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");//null

        System.out.println(resource1); // null
        System.out.println(resource2); // 非null
        System.out.println(resource3); // 非null
        System.out.println(resource4); // 非null
        System.out.println(resource5); // null
    }

在这里插入图片描述

getProtectionDomain

    @Test
    public void getProtectionDomainTest() {
        ProtectionDomain protectionDomain = ReflectTest.class.getProtectionDomain();
        System.out.println(protectionDomain);
    }

输出
在这里插入图片描述

desiredAssertionStatus 返回将分配给此类的断言状态。

    @Test
    public 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

    @Test
    public 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 提供了一种可靠的转换方式。

    @Test
    public 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}。如果这个方法成功,它总是返回对这个类对象的引用。

   @Test
    public 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

    @Test
    public 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);
        }
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/691394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

各品牌电视安装第三方软件失败的解决方法

在安装电视第三方软件时&#xff0c;您可能会遇到安装失败、解析错误或无法识别文件类型等问题。以下是一些常见问题的解决方案&#xff0c;小武给您整理了详细的步骤来帮助解决这些问题。 手机投屏或安装方法参考如下文章&#xff1a; 移动端投屏到大屏幕的操作详解 通过U盘…

SpringBoot图书管理系统【附:资料➕文档】

前言&#xff1a;我是源码分享交流Coding&#xff0c;专注JavaVue领域&#xff0c;专业提供程序设计开发、源码分享、 技术指导讲解、各类项目免费分享&#xff0c;定制和毕业设计服务&#xff01; 免费获取方式--->>文章末尾处&#xff01; 项目介绍048&#xff1a; 图…

2024年6月8日 每周新增游戏

中医百科中药: 中医百科中药是一款非常强大的中药知识科普软件&#xff0c;该应用提供500多味中草药的文献资料&#xff0c;强大的搜索功能可根据功效、特点和关键词来快速查找中药&#xff0c;而且每味中药的图片、功效、主治、炮制方法等百科知识&#xff0c;可以很好的帮助你…

计算机专业本科论文起稿咋写

举例基于SpringBoot的Java基础的旅游管理系统 摘要 随着旅游业的快速发展&#xff0c;传统的旅游管理方式已经难以满足现代企业的需求。为了提高旅游企业的管理水平和服务质量&#xff0c;本文设计并实现了一个基于SpringBoot框架的旅游管理系统。本文首先介绍了旅游管理系统的…

E: 仓库 “http://download...graphics:/darktable/xUbuntu_22.04 InRelease” 没有数字签名

问题 Ubuntu22.04装了darktable软件没装好&#xff0c;已经卸载了但是没卸载干净,终端使用 sudo apt update 出现的问题&#xff1a; 解决&#xff1a; sudo nano /etc/apt/sources.list.d/*darktable*.list找到了该软件的相关仓库条目&#xff1a;直接给他注释掉就行了。

springcloud第4季 springcloud-gateway网关filter案例场景

一 filter作用 1.1 filter搭建流程 1.1.1 网关配置 1.1.2 服务提供者 1.1.3 测试验证 1.启动consul 2.启动zipkin 3.启动应用微服务 4.进行访问&#xff1a; http://localhost:6666/pay/wg/filter 1.2 其他常见API RemoveRequestHeadersec-fetch-site # 删除请求…

重构大学数学基础_week04_从点积理解傅里叶变换

这周我们来看一下傅里叶变换。傅里叶变换是一种在数学和许多科学领域中广泛应用的分析方法&#xff0c;它允许我们将信号或函数从其原始域&#xff08;通常是时间域或空间域&#xff09;转换到频域表示。在频域中&#xff0c;信号被表示为其组成频率的幅度和相位&#xff0c;这…

电脑下载速度很慢怎么解决 电脑下载加速工具测评推荐

电脑下载速度慢&#xff0c;不仅耗时冗长&#xff0c;还会影响工作和学习效率。漫长的等待让人心情焦虑&#xff0c;每一秒都是对耐心的极大考验。有关电脑下载速度很慢怎么解决&#xff0c;电脑下载加速工具评测推荐的问题&#xff0c;本文将进行详细介绍。 一、电脑下载速度…

一个简单的消息队列

目录 原理 实现代码 示例 原理 消息队列是一个先进先出栈&#xff0c;每次都处理第一项&#xff0c;处理完了过后会删除这个消息&#xff0c;这是一个简单的消息队列图&#xff1a; 实现代码 首先消息队列需要一个队列&#xff0c;我们用Python里的列表&#xff1a; self.…

信息学奥赛初赛天天练-23-CSP-J2023基础题-指针、链表、哈夫曼树与哈夫曼编码的实战应用与技巧大揭秘

PDF文档公众号回复关键字:20240608 单项选择题&#xff08;共15题&#xff0c;每题2分&#xff0c;共计30分&#xff1a;每题有且仅有一个正确选项&#xff09; 4 假设有一个链表的节点定义如下&#xff1a; struct Node {int data; Node* next; };现在有一个指向链表头部…

今年618,京东和爱奇艺为大屏品质“把关”

今年618电视大战&#xff0c;还是打响了。 根据京东618数据显示&#xff0c;618开门红阶段热卖TOP10电视均为75英寸以上的大屏&#xff0c;拥有超高画质的MiniLED电视成交量同比增长5倍。可以看到&#xff0c;大屏电视逐步成为消费主流&#xff0c;尤其是拥有出色视听体验的高…

【MYSQL系列】mysql中text,longtext,mediumtext区别

【MYSQL系列】mysql中text,longtext,mediumtext区别 在MySQL数据库中&#xff0c;TEXT、LONGTEXT和MEDIUMTEXT都是用于存储大量文本数据的字段类型。它们之间的主要区别在于可存储的数据大小和性能方面的差异。本文将探讨这些字段类型的特点、使用场景和一些最佳实践。 TEXT类…

How To: Localize Bar and Ribbon Skin Items

您可以使用Localizer对象自定义皮肤菜单&#xff0c;而不是迭代每个条形皮肤子菜单项和功能区皮肤库项容器来手动修改这些项。此方法允许您同时自定义所有现有栏子菜单和功能区库中的外观项目。 创建BarLocalizer类的派生类并重写XtraLocalizer.GetLocalizedString方法。 pub…

《python程序语言设计》2018版第5章第46题均值和标准方差-上部(我又一次被作者的出题击倒)

第N次被作者打倒了&#xff0c;第5章46题解题上集的记录 计算均值的代码段 step_num 0num_c 0 pow_c 0 while step_num < 10:a eval(input("Enter number is: "))num_c apow_c pow(a, 2)step_num 1 t2 num_c / 10这个结果和书里的答案差一点。书里写的是…

易飞销货单出货时审核库存检查

公司接到一客户因品种多而数量少&#xff0c;单一出货计划行比较多&#xff0c;而只上了生产ERP易飞&#xff0c;审核时经常会出现倒催货&#xff0c;提前做销售单&#xff0c;行数有时超30行以上&#xff0c;审核跳窗报错时也不方便查找&#xff0c;特写一外挂程序&#xff0c…

植物大战僵尸杂交版最新2.0.88手机+电脑+苹果+修改器

在这个充满奇妙的平行宇宙中&#xff0c;植物和僵尸竟然能够和谐共存&#xff01;是的&#xff0c;你没听错&#xff01;一次意外的实验&#xff0c;让这两个看似对立的生物种类发生了基因杂交&#xff0c;创造出了全新的生物种类——它们既能够进行光合作用&#xff0c;也具备…

【NI国产替代】PCIe 高速采集卡, 8 位双通道数字化仪器,采集卡最高采样率高达 5 GS/s 模拟带宽高达 500 MHz

• 8 位双通道数字化仪器 • 最高采样率高达 5 GS/s • 模拟带宽高达 500 MHz • 采用 PCIe 3.0 x 8 接口 • 基于 Xilinx Kintex UltraScale, XCKU040 • 提供硬件、FPGA、软件定制服务 高速采集卡是一款 8 位双通道数字化仪器&#xff0c;采集卡最高采样率高达 5 GS/s 模…

数据结构及研究

**数据结构是计算机存储、组织数据的方式&#xff0c;它是相互之间存在一种或多种特定关系的数据元素的集合**Θic-1ΘΘic-2ΘΘic-3ΘΘic-4ΘΘic-5Θ。 数据结构这一概念在计算机科学领域扮演着至关重要的角色&#xff0c;它不仅决定了数据在计算机内部的存储方式&#xf…

突发!凌晨4点某制造业大厂国产数据库集群故障...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

Android开机动画关闭流程

一步一图项目上要加一个开机动画结束的回调&#xff0c;我这边看下如何加 好&#xff0c;老规矩&#xff0c;如何启动动画&#xff1f;动画是谁启动的&#xff1f;怎么关闭的&#xff1f;谁通知关闭的 带着问题看源码 动画的启动流程 开机动画的主入口在哪&#xff1f; 这个…