JDK1.8源码阅读(6)--Error/Exception/Class

跨平台烧录实战:RKDevTool在Windows/Linux/MacOS下的统一与差异 本文详细解析了RKDevTool在Windows、Linux和macOS三大操作系统下的固件烧录实践,重点介绍了RK3576开发板的环境配置、工具链选择、烧录模式切换及常见问题解决方案,帮助开发者构建稳定可靠的跨平台烧录工作流。 阅读详情

JDK1.8源码阅读(6)–Error/Exception/Class

一.Error类

类图:
在这里插入图片描述
Error类继承于Throwable类
static final long serialVersionUID = 4980196508277280342L; 序列号

public Error()
构造方法,这里用的是父类Throwable的构造方法

    public Error() {
        super();
    }

public Error(String message) 父类的构造方法

    public Error(String message) {
    //
        super(message);
    }

public Error(String message, Throwable cause)
public Error(Throwable cause)
protected Error(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace)
可以看到Error类主要的就是4个构造方法,其他的都是使用Throwable类的

二.Exception类

类图:
在这里插入图片描述
static final long serialVersionUID = -3387516993124229948L; 序列号
除了四个构造方法外,其他的也一样。

三.Class类

类图:
在这里插入图片描述
实现了Type接口,GenericDeclaration接口,AnnotatedElement接口,Serializable接口,首先先看看这几个接口定义了什么:
1️⃣Type接口:
代表Java中的“类型”
主要包括5种实现:Class,TypeVariable,ParameterizedType,WildcardType,GenericArrayType

//返回当前类型的详细介绍
    default String getTypeName() {
        return toString();
    }

2️⃣AnnotatedElement接口,

//判断当前元素上是否存在注解
    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
        return getAnnotation(annotationClass) != null;
    }
//返回该元素上指定类型的注解(对于类来说,包括继承来的注解)
<T extends Annotation> T getAnnotation(Class<T> annotationClass)
返回该元素上所有类型的注解(对于类来说,包括继承来的注解)
Annotation[] getAnnotations()
//返回该元素上指定类型的注解(对于类来说,包括继承来的注解)
    default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
         /*
          * Definition of associated: directly or indirectly present OR
          * neither directly nor indirectly present AND the element is
          * a Class, the annotation type is inheritable, and the
          * annotation type is associated with the superclass of the
          * element.
          */
         T[] result = getDeclaredAnnotationsByType(annotationClass);

         if (result.length == 0 && // Neither directly nor indirectly present
             this instanceof Class && // the element is a class
             AnnotationType.getInstance(annotationClass).isInherited()) { // Inheritable
             Class<?> superClass = ((Class<?>) this).getSuperclass();
             if (superClass != null) {
                 // Determine if the annotation is associated with the
                 // superclass
                 result = superClass.getAnnotationsByType(annotationClass);
             }
         }

         return result;
     }
//返回该元素上指定类型的注解(对于类来说,不包括继承来的注解)
    default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) {
         Objects.requireNonNull(annotationClass);
         // Loop over all directly-present annotations looking for a matching one
         for (Annotation annotation : getDeclaredAnnotations()) {
             if (annotationClass.equals(annotation.annotationType())) {
                 // More robust to do a dynamic cast at runtime instead
                 // of compile-time only.
                 return annotationClass.cast(annotation);
             }
         }
         return null;
     }
//返回该元素上指定类型的注解(对于类来说,不包括继承来的注解)
    default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
        Objects.requireNonNull(annotationClass);
        return AnnotationSupport.
            getDirectlyAndIndirectlyPresent(Arrays.stream(getDeclaredAnnotations()).
                                            collect(Collectors.toMap(Annotation::annotationType,
                                                                     Function.identity(),
                                                                     ((first,second) -> first),
                                                                     LinkedHashMap::new)),
                                            annotationClass);
    }
//返回该元素上所有类型的注解(对于类来说,不包括继承来的注解)
Annotation[] getDeclaredAnnotations();

3️⃣GenericDeclaration接口
泛型元素,指有能力引入泛型声明的元素,比如类、方法、构造器

//// 返回generic type中的type variable,如:Map<K, V>中的K和V
public TypeVariable<?>[] getTypeParameters();

接下来进入Class类的源码分析:
private static final int ANNOTATION= 0x00002000;
private static final int ENUM = 0x00004000;
private static final int SYNTHETIC = 0x00001000;

//可以看做本地方法的注册加载
    private static native void registerNatives();
    static {
        registerNatives();
    }
//构造方法,指定类的构造器
private Class(ClassLoader loader) {
        classLoader = loader;
    }
//重写toString方法,是否是接口,如果是接口输出“interface”;如果不是,判断是否是基本类型,如果是就输出“”,不是输出“class”,最后加个名称
    public String toString() {
        return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
            + getName();
    }
//打印类完整声明
    public String toGenericString() {
        if (isPrimitive()) {
            return toString();
        } else {
            StringBuilder sb = new StringBuilder();

            // 加入修饰符
            int modifiers = getModifiers() & Modifier.classModifiers();
            if (modifiers != 0) {
                sb.append(Modifier.toString(modifiers));
                sb.append(' ');
            }
		//加入是否是注解
            if (isAnnotation()) {
                sb.append('@');
            }
            //是否是接口
            if (isInterface()) { // Note: all annotation types are interfaces
                sb.append("interface");
            } else {
            //是否是枚举类
                if (isEnum())
                    sb.append("enum");
                else
                    sb.append("class");
            }
            sb.append(' ');
            sb.append(getName());
			//泛型
            TypeVariable<?>[] typeparms = getTypeParameters();
            if (typeparms.length > 0) {
                boolean first = true;
                sb.append('<');
                for(TypeVariable<?> typeparm: typeparms) {
                    if (!first)
                        sb.append(',');
                    sb.append(typeparm.getTypeName());
                    first = false;
                }
                sb.append('>');
            }

            return sb.toString();
        }
    }
//根据类的全名加载类对象,而且加载类之后对类的静态元素进行初始化
    @CallerSensitive
    public static Class<?> forName(String className)
                throws ClassNotFoundException {
        Class<?> caller = Reflection.getCallerClass();
        return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
    }
//根据类的全名和指定的类加载器加载类对象,initialize参数指示是否在加载类之后对类中的静态元素进行初始化
@CallerSensitive
    public static Class<?> forName(String name, boolean initialize,
                                   ClassLoader loader)
        throws ClassNotFoundException
    {
        Class<?> caller = null;
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            // Reflective call to get caller class is only needed if a security manager
            // is present.  Avoid the overhead of making this call otherwise.
            caller = Reflection.getCallerClass();
            if (sun.misc.VM.isSystemDomainLoader(loader)) {
                ClassLoader ccl = ClassLoader.getClassLoader(caller);
                if (!sun.misc.VM.isSystemDomainLoader(ccl)) {
                    sm.checkPermission(
                        SecurityConstants.GET_CLASSLOADER_PERMISSION);
                }
            }
        }
        return forName0(name, initialize, loader, caller);
    }
//本地方法,通过设定类名称,是否初始化静态变量,制定类加载器以及当前调用该方法的类来得到想要的类对象
    private static native Class<?> forName0(String name, boolean initialize,
                                            ClassLoader loader,
                                            Class<?> caller)
        throws ClassNotFoundException;
//生成当前类的对象
    @CallerSensitive
    public T newInstance()
        throws InstantiationException, IllegalAccessException
    {
        if (System.getSecurityManager() != null) {
            checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);
        }
        if (cachedConstructor == null) {
            if (this == Class.class) {
                throw new IllegalAccessException(
                    "Can not call newInstance() on the Class for java.lang.Class"
                );
            }
            try {
                Class<?>[] empty = {};
                final Constructor<T> c = getConstructor0(empty, Member.DECLARED);
                // Disable accessibility checks on the constructor
                // since we have to do the security check here anyway
                // (the stack depth is wrong for the Constructor's
                // security check to work)
                java.security.AccessController.doPrivileged(
                    new java.security.PrivilegedAction<Void>() {
                        public Void run() {
                                c.setAccessible(true);
                                return null;
                            }
                        });
                cachedConstructor = c;
            } catch (NoSuchMethodException e) {
                throw (InstantiationException)
                    new InstantiationException(getName()).initCause(e);
            }
        }
        Constructor<T> tmpConstructor = cachedConstructor;
        // Security check (same as in java.lang.reflect.Constructor)
        int modifiers = tmpConstructor.getModifiers();
        if (!Reflection.quickCheckMemberAccess(this, modifiers)) {
            Class<?> caller = Reflection.getCallerClass();
            if (newInstanceCallerCache != caller) {
                Reflection.ensureMemberAccess(caller, this, null, modifiers);
                newInstanceCallerCache = caller;
            }
        }
        // Run constructor
        try {
            return tmpConstructor.newInstance((Object[])null);
        } catch (InvocationTargetException e) {
            Unsafe.getUnsafe().throwException(e.getTargetException());
            // Not reached
            return null;
        }
    }
private volatile transient Constructor<T> cachedConstructor;  构造器缓存
private volatile transient Class<?>       newInstanceCallerCache;  调用者类的缓存
//本地方法,判断是否是一个对象
public native boolean isInstance(Object obj);
//判断cls是否是当前类的父类
public native boolean isAssignableFrom(Class<?> cls)
//判断是否是个接口
public native boolean isInterface();
public native boolean isArray();  判断是否是个数组
//判读是否是个基础类型
public native boolean isPrimitive();
//判断是否有注释
    public boolean isAnnotation() {
        return (getModifiers() & ANNOTATION) != 0;
    }
//判断修饰符是否是synthetic
public boolean isSynthetic() {
        return (getModifiers() & SYNTHETIC) != 0;
    }
//返回类的姓名
    public String getName() {
        String name = this.name;
        if (name == null)
            this.name = name = getName0();
        return name;
    }
    private transient String name; 姓名的缓存
    private native String getName0(); 获取当前类的名称
//得到当前类所使用的类加载器
    @CallerSensitive
    public ClassLoader getClassLoader() {
        ClassLoader cl = getClassLoader0();
        if (cl == null)
            return null;
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
        }
        return cl;
    }
        ClassLoader getClassLoader0() { return classLoader; }
    private final ClassLoader classLoader;  类加载器是一个常量,一个类智能指定唯一的类加载器
//返回generic type中的type variable,如:Map<K, V>中的K和V
    public TypeVariable<Class<T>>[] getTypeParameters() {
        ClassRepository info = getGenericInfo();
        if (info != null)
            return (TypeVariable<Class<T>>[])info.getTypeParameters();
        else
            return (TypeVariable<Class<T>>[])new TypeVariable<?>[0];
    }
public native Class<? super T> getSuperclass();
本地方法,得到父类
//获取当前类的父类(可识别泛型类型和非泛型类型)
    public Type getGenericSuperclass() {
        ClassRepository info = getGenericInfo();
        if (info == null) {
            return getSuperclass();
        }
        if (isInterface()) {
            return null;
        }
        return info.getSuperclass();
    }
//获取当前类所在包的package信息
    public Package getPackage() {
        return Package.getPackage(this);
    }
//获取当前类的父接口,不包括父类/父接口实现的接口(只识别非泛型类型)
    public Class<?>[] getInterfaces() {
        ReflectionData<T> rd = reflectionData();
        if (rd == null) {
            // no cloning required
            return getInterfaces0();
        } else {
            Class<?>[] interfaces = rd.interfaces;
            if (interfaces == null) {
                interfaces = getInterfaces0();
                rd.interfaces = interfaces;
            }
            // defensively copy before handing over to user code
            return interfaces.clone();
        }
    }
    private native Class<?>[] getInterfaces0();
//获取当前类的父接口,不包括父类/父接口实现的接口(识别泛型类型)
    public Type[] getGenericInterfaces() {
        ClassRepository info = getGenericInfo();
        return (info == null) ?  getInterfaces() : info.getSuperInterfaces();
    }
//获取数组的组件类型,如int[]返回int,int[][]返回int[]。如果不是数组,则返回空
public native Class<?> getComponentType();
public native int getModifiers(); //得到修饰符
//获取签名信息
public native Object[] getSigners();
native void setSigners(Object[] signers);
//内部静态类,描述了内部类以及方法名称和方法描述。
    private final static class EnclosingMethodInfo {
        private Class<?> enclosingClass;
        private String name;
        private String descriptor;

        private EnclosingMethodInfo(Object[] enclosingInfo) {
            if (enclosingInfo.length != 3)
                throw new InternalError("Malformed enclosing method information");
            try {
                // The array is expected to have three elements:

                // the immediately enclosing class
                enclosingClass = (Class<?>) enclosingInfo[0];
                assert(enclosingClass != null);

                // the immediately enclosing method or constructor's
                // name (can be null).
                name            = (String)   enclosingInfo[1];

                // the immediately enclosing method or constructor's
                // descriptor (null iff name is).
                descriptor      = (String)   enclosingInfo[2];
                assert((name != null && descriptor != null) || name == descriptor);
            } catch (ClassCastException cce) {
                throw new InternalError("Invalid type in enclosing method information", cce);
            }
        }

        boolean isPartial() {
            return enclosingClass == null || name == null || descriptor == null;
        }

        boolean isConstructor() { return !isPartial() && "<init>".equals(name); }

        boolean isMethod() { return !isPartial() && !isConstructor() && !"<clinit>".equals(name); }

        Class<?> getEnclosingClass() { return enclosingClass; }

        String getName() { return name; }

        String getDescriptor() { return descriptor; }

    }
//得到内部方法明细
    private EnclosingMethodInfo getEnclosingMethodInfo() {
        Object[] enclosingInfo = getEnclosingMethod0();
        if (enclosingInfo == null)
            return null;
        else {
            return new EnclosingMethodInfo(enclosingInfo);
        }
    }
//得到这个类是在哪个方法中定义的
    @CallerSensitive
    public Method getEnclosingMethod() throws SecurityException {
        EnclosingMethodInfo enclosingInfo = getEnclosingMethodInfo();

        if (enclosingInfo == null)
            return null;
        else {
            if (!enclosingInfo.isMethod())
                return null;

            MethodRepository typeInfo = MethodRepository.make(enclosingInfo.getDescriptor(),
                                                              getFactory());
            Class<?>   returnType       = toClass(typeInfo.getReturnType());
            Type []    parameterTypes   = typeInfo.getParameterTypes();
            Class<?>[] parameterClasses = new Class<?>[parameterTypes.length];

            // Convert Types to Classes; returned types *should*
            // be class objects since the methodDescriptor's used
            // don't have generics information
            for(int i = 0; i < parameterClasses.length; i++)
                parameterClasses[i] = toClass(parameterTypes[i]);

            // Perform access check
            Class<?> enclosingCandidate = enclosingInfo.getEnclosingClass();
            enclosingCandidate.checkMemberAccess(Member.DECLARED,
                                                 Reflection.getCallerClass(), true);
            /*
             * Loop over all declared methods; match method name,
             * number of and type of parameters, *and* return
             * type.  Matching return type is also necessary
             * because of covariant returns, etc.
             */
            for(Method m: enclosingCandidate.getDeclaredMethods()) {
                if (m.getName().equals(enclosingInfo.getName()) ) {
                    Class<?>[] candidateParamClasses = m.getParameterTypes();
                    if (candidateParamClasses.length == parameterClasses.length) {
                        boolean matches = true;
                        for(int i = 0; i < candidateParamClasses.length; i++) {
                            if (!candidateParamClasses[i].equals(parameterClasses[i])) {
                                matches = false;
                                break;
                            }
                        }

                        if (matches) { // finally, check return type
                            if (m.getReturnType().equals(returnType) )
                                return m;
                        }
                    }
                }
            }

            throw new InternalError("Enclosing method not found");
        }
    }
    private static Class<?> toClass(Type o) {
        if (o instanceof GenericArrayType)
            return Array.newInstance(toClass(((GenericArrayType)o).getGenericComponentType()),
                                     0)
                .getClass();
        return (Class<?>)o;
     }
//如果该类是构造函数中生成的,那么返回这个构造函数
public Constructor<?> getEnclosingConstructor()
//获取[成员内部类]所处的外部类(仅对成员内部类有效),如果并非内部类,则返回null
public Class<?> getDeclaringClass() throws SecurityException
//获取[内部类]所处的外部类(对成员内部类、方法内部类、匿名内部类均有效)
   public Class<?> getEnclosingClass() throws SecurityException
// 简单名称,可以看做是不带包名和外部类名的规范名(匿名类没有)
char                        基本类型
char[]                      基本类型数组
Outer                       引用类型
Outer[]                     引用类型数组
Inner                       内部类
                            匿名类
Outer$$Lambda$1/1989780873  Lambda表达式
public String getSimpleName()
// 类型名称
char                                 基本类型
char[]                               基本类型数组
com.kang.Outer                       引用类型
com.kang.Outer[]                     引用类型数组
com.kang.Outer$Inner                 内部类
com.kang.Outer$1                     匿名类
com.kang.Outer$$Lambda$1/1989780873  Lambda表达式
public String getTypeName()
//判断是否是ascii码
private static boolean isAsciiDigit(char c)
//规范名称,尽量遵从书写习惯(匿名类为null)
char                                 基本类型
char[]                               基本类型数组
com.kang.Outer                       引用类型
com.kang.Outer[]                     引用类型数组
com.kang.Outer.Inner                 内部类
null                                 匿名类
com.kang.Outer$$Lambda$1/1989780873  Lambda表达式
public String getCanonicalName()
//是不是匿名类
public boolean isAnonymousClass()
//是不是方法内部类
public boolean isLocalClass()
//是不是成员内部类
public boolean isMemberClass()
//返回内部类的名称
private String getSimpleBinaryName()
//是不是方法内部类或者匿名内部类
private boolean isLocalOrAnonymousClass()
// 获取当前类包含的内部类/接口,仅包含public修饰的内部接口、内部抽象类、内部实例类,会继承父类内容,但不会继承父接口的内容
    public Class<?>[] getClasses() {
        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), false);
        return java.security.AccessController.doPrivileged(
            new java.security.PrivilegedAction<Class<?>[]>() {
                public Class<?>[] run() {
                    List<Class<?>> list = new ArrayList<>();
                    Class<?> currentClass = Class.this;
                    while (currentClass != null) {
                        Class<?>[] members = currentClass.getDeclaredClasses();
                        for (int i = 0; i < members.length; i++) {
                            if (Modifier.isPublic(members[i].getModifiers())) {
                                list.add(members[i]);
                            }
                        }
                        currentClass = currentClass.getSuperclass();
                    }
                    return list.toArray(new Class<?>[0]);
                }
            });
    }
// 返回当前类中所有public字段,包括父类/父接口中的public字段
    public Field[] getFields() throws SecurityException {
        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
        return copyFields(privateGetPublicFields(null));
    }
public Method[] getMethods()  获取所有public修饰的方法
public Constructor<?>[] getConstructors() 获取所有的public修饰构造函数
public Field getField(String name)  获取指定名称的public修饰的字段
public Method getMethod(String name, Class<?>... parameterTypes)   得到指定名称指定参数的public修饰的方法
public Constructor<T> getConstructor(Class<?>... parameterTypes) 得到指定名称指定参数的public修饰的构造方法
public Class<?>[] getDeclaredClasses() // 获取当前类包含的内部类/接口,包含所有权限修饰符修饰的内部接口、内部抽象类、内部实例类,不会继承父类和父接口的内容
public Field[] getDeclaredFields()  获得所有的字段
public Method[] getDeclaredMethods()  获取所有的方法
public Constructor<?>[] getDeclaredConstructors()  获取所有的构造函数
public Field getDeclaredField(String name)  获取指定名称的字段
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)  获取指定名称和参数的方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)  获取指定名称和参数的构造函数
//    /*
     * 查找指定名称的资源,并返回其输入流。
     * 如果当前类位于命名模块,则在模块路径(根目录)下查找;否则,在类路径(根目录)上查找。
     *
     * resName路径内部需以"/"分割。
     * 如果resName以'/'开头,则会在模块路径/类路径的根目录下查找;
     * 如果resName不以'/'开头,则会在(当前类所在目录+"/"+resName)下查找
     */
public InputStream getResourceAsStream(String name) 
//查找指定名称的资源,并返回其URL。
public java.net.URL getResource(String name)
//检查类的可访问性
    private void checkMemberAccess(int which, Class<?> caller, boolean checkProxyInterfaces) {
        final SecurityManager s = System.getSecurityManager();
        if (s != null) {
            final ClassLoader ccl = ClassLoader.getClassLoader(caller);
            final ClassLoader cl = getClassLoader0();
            if (which != Member.PUBLIC) {
                if (ccl != cl) {
                    s.checkPermission(SecurityConstants.CHECK_MEMBER_ACCESS_PERMISSION);
                }
            }
            this.checkPackageAccess(ccl, checkProxyInterfaces);
        }
    }
//// 如果resName以'/'开头,则去掉开头的"/"后返回;否则,将当前类所在包名转换为路径,并将该路径添加到resName前面后返回
private String resolveName(String name)
普冉PY32F002B ADC内部参考电压VREFINT的误差补偿与低功耗优化实践 本文详细介绍了普冉PY32F002B单片机在锂电池供电场景下ADC内部参考电压VREFINT的误差补偿与低功耗优化实践。通过分析GPIO配置、分压电阻匹配、采样时间设置等硬件设计要点,结合实时测量VREFINT电压值和软件补偿算法,有效提升了ADC测量精度至5mV以内,并实现了分压电路功耗控制与采样频率优化,为低成本消费电子项目提供了完整的解决方案。 阅读详情

相关推荐

RK3568-MIPI屏幕调试实战:LCD初始化时序解析与转换

本文详细解析RK3568平台MIPI屏幕调试中的LCD初始化时序,重点介绍DCS Write与Generic Write数据类型的转换方法,并提供厂家时序到RK格式的实战转换案例。通过理解上电初始化时序的重要性,帮助开发者快速解决屏幕不亮、花屏等常见调试问题,提升RK3568硬件开发效率。

d6e7f8g9h的博客 186

07_异常处理————随堂练习

1、判断程序的输出结果 public class ReturnExceptionDemo { static void methodA() { try { System.out.println("进入方法A"); throw new RuntimeException("制造异常"); } ...

weixin_45801537的博客 464

用MATLAB从零实现六足机器人步态仿真:交替三角与波动步态保姆级教程

本文详细介绍了如何使用MATLAB从零实现六足机器人的两种经典步态仿真:交替三角支撑步态和波动步态。通过参数定义、相位设置、运动轨迹生成和三维可视化等步骤,帮助读者掌握六足机器人步态规划的核心技术。教程包含完整代码和详细解析,适合机器人爱好者和相关专业学生学习实践。

weixin_26765363的博客 227

自定义异常及Exception有参构造函数源码解析

1、写一个自定义的异常类(MyException),让其继承Exception. public class MyException extends Exception { static final long serialVersionUID = -3387516993124229948L; public MyException() { } public MyException(String s){ super(s); } } 2、分析super

qq_45396650的博客 1227

Concentration Inequality(集中不等式)更新版

欢迎来我博客 https://wyue.name/2020/04/17/1/阅读这一篇博文 转载前请联系我,联系方式请见我博客 https://wyue.name/ Concentration inequality 刻画了一组随机变量的和(或者样本平均数)与其期望值的偏离程度,在算法收敛性分析过程中是非常有用的一类不等式。 这次主要总结一下最近一段时间遇到的集中不等式,不仅是不等式形式,...

Yue的博客 4554

k8s架构、工作流程、集群组件详解

Kubernetes(简称K8s,是因为 k 和 s 之间有八个字符)是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制,用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制,同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型(Master-Slave架构),其中Master节点负责核心的调度、管理和运维任务,而Slave节点负责运行应用程序的容器。

qq_51545656的博客 4382

Java 异常处理

异常处理是Java中唯一正式的错误报告机制。异常处理机制最大的好处就是降低错误代码处理的复杂程度。 通过该 Chat,您可以了解: Java 异常体系 自定义异常 常见异常处理策略 异常框架实战 Spring MVC 统一异常处理 Spring Cloud 异常穿透 ...

GitChat 659

微调实操一: 增量预训练(Pretraining)

《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代码比较难以理解,而且模型只能从hugging face上下载,对于一些国内服务器无法访问,我重构了代码,让训练代码更有可读性,并参考LLAMAFactory的项目,增加了modelscope上下载模型,轻松在国内服务器运行.

youbingchen的博客 6993

Java异常和@Transactional(rollbackFor=Exception.class)

如果你不懂异常,那看完我这篇文章应该很快对异常有了一个大概的了解。

Ddd_victory的博客 8266

基于特征模仿的YOLOv5中间层知识蒸馏:原理、实现与实验全解析

目标检测中的模型轻量化是一个关键挑战。本文提出一种基于特征模仿(Feature Imitation)的YOLOv5中间层知识蒸馏方法,通过让学生模型学习教师模型的中间层特征表示,显著提升轻量级检测器的性能。我们将详细阐述蒸馏损失函数的设计、特征对齐策略、训练流程,并提供完整可运行的代码实现。同时,推荐多个适合蒸馏训练的数据集,并通过实验验证方法的有效性。

YOLO 185

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1766

《C++11标准库》4.3.1标准的 Exception Class(异常类)

所有被语言本身或标准库抛出的异常,都派生自基类 exception ,定义于 <exception> 。它是若干标准异常的基类,它们共同形成一个类体系,如图所示, 这些标准异常可被分为三组: 1:语言本身支持的异常。 2:C++标准库发出的异常。 3:程序作用域之外发出的异常。 逻辑错误通常可以避免,因为其错误发生在作用域内,例如先决条件被违反。运行期异常则是由一个位于程序作用域之外的原因触发,例如资源不足。 针对语言支持而设计的异常类: 此类异常用以支撑某些语言特性,所以,从

weixin_60351940的博客 1430

手把手教你学Simulink实例:基于Simulink的超级电容器充放电仿真

超级电容器(Supercapacitor)是一种高容量电容器,具有快速充放电能力、长寿命和高功率密度等优点。它在能量存储系统、电动汽车、不间断电源(UPS)等领域有广泛应用。为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。

MHD0815的博客 581

第3章:OpenJDK从源码到字节码——Class 文件与 javac 管线

文章摘要 本文通过一个团队从JDK 8升级到JDK 21时遇到的反射异常问题,揭示了Java字节码层面的兼容性挑战。项目背景中指出了开发者面临的三大痛点:黑盒编译、语法糖陷阱和字节码增强盲区。随后通过师徒对话的形式,生动讲解了Class文件结构(魔数、常量池)和关键字节码指令(如invokevirtual等)。最后给出实战示例,分析自动装箱、泛型、lambda等语法糖在字节码层面的实现原理,帮助开发者建立字节码阅读能力,解决跨版本兼容性问题。

davidwang456的专栏 497

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

AutoJs6 版本演进全解析:从 v6.0.0 到 v6.6.1 的核心能力与技术脉络

AutoJs6 是安卓平台 JavaScript 自动化工具(Auto.js 二次开发项目),其官方变更日志 [CHANGELOG-zh-Hant-HK.md](https://link.gitcode.com/i/669e254b20efb62cb94d68b4d69fb9a6) 完整记录了从 v6.0.0(2021/12/01)到 v6.6.1(2025/01/01)四个年头、十余个版本的迭代

gitblog_01106的博客 491

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java反编译实战:从class到java的原理、工具与工程应用

Java反编译是将JVM可执行的.class字节码逆向还原为人类可读.java源码的技术过程,其底层依赖JVM规范定义的结构化类文件格式与确定性指令映射规则。它并非代码恢复魔法,而是基于字节码语义重建语法结构的工程能力,核心价值在于验证行为一致性、排查生产问题、理解第三方依赖及审计安全风险。在开发调试、SDK分析、漏洞识别等真实场景中,JD-GUI、CFR、IDEA内置反编译器等工具通过AST重构或字节码解析,支撑从单个class快速检视到整个jar包批量导出的完整工作流。本文聚焦class文件与java文

weixin_33816300的博客 393

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Files 文件管理器完全实用指南:从安装到找文件、整理文件的高效技巧

Files 文件管理器是一款面向 Windows 10 与 11 的开源文件管理器,界面和交互逻辑与资源管理器相似但更现代。本文按新手使用顺序,讲清 Windows 文件管理器安装方法、日常找文件与整理流程,以及快捷键、布局定制、问题排查等提效技巧,帮助你一次读完后就能上手。 [![Files 文件管理器主界面:文件网格、侧边栏固定项与本地驱动器](https://raw.gitcode.com

gitblog_00770的博客 441

唯品会Java开发手册之异常处理:从 8 大规约到 vjtools 的源码级实践

本文以《唯品会Java开发手册》(vjtools 仓库 docs/standard 章节)中的“异常处理”一章为骨架,系统讲解 Java 异常创建成本、静态异常复用、异常抛出/捕获/处理及 finally 块等 8 大规约,并逐一对应到仓库中 vjkit 工具库(ExceptionUtil、CloneableException、IOUtil 等)与 sonar-vj 定制规则的源码实现。读完本文,

gitblog_00431的博客 380

AutoJs6 完整版本历史全解析:从 v6.0.0 到 v6.6.1 的功能演进、修复清单与依赖升级指南

AutoJs6 是安卓平台 JavaScript 自动化工具(Auto.js 二次开发项目),本文以官方简体中文 CHANGELOG([app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md](https://link.gitcode.com/i/3f9ec932134f7e4c712758073fb8c0df))为骨架,完整梳理 v6.0.0(2021/

gitblog_00972的博客 686

Java异常处理面试核心问题详解:从异常分类、处理机制到OOM捕获的全面解析

本文围绕 YCBlogs 仓库中 10.9 Java异常问题.md 记录的九大高频 Java 异常面试问题展开系统梳理:从运行时异常/受检查异常的分类、异常处理机制的底层原理,到 throw/throws 差异、异常链、方法覆盖规则、catch 层级关系、自定义异常以及 OOM 是否可捕获等实战要点。文中所有结论均结合仓库内 [Throwable异常体系](https://link.gitcode

gitblog_00150的博客 190

Java SE 基础:面向对象、继承多态、抽象接口与异常(JDK 8)

本文整理 Java SE 学习中的面向对象核心知识,包括类与对象、封装、继承、方法重写、多态、抽象类、接口、内部类与异常处理。文章结合 Java 8 示例代码、示意图和常见易错点,适合作为入门阶段的复习、复盘与学习记录。

m0_73494933的博客 187

JDK 动态代理实现原理解析:从 Proxy.newProxyInstance 到 $Proxy0 代理类字节码(Source Code Hunter 源码赏析)

本篇围绕 JDK 动态代理的底层实现展开:从 `Proxy.newProxyInstance()` 的调用入口出发,先给出一个完整的增强示例,再借助 `ProxyGenerator` 将运行时生成的代理类字节码反编译出来,逐段剖析 `$Proxy0` 的类结构、静态块、构造器与方法回调,最终把“代理方法 → `super.h.invoke()` → `InvocationHandler.invok

gitblog_01082的博客 424

OpenJDK源码实战:从JVM调试到HotSpot修改

JVM是Java程序的运行基石,其底层实现HotSpot基于C++构建,本质是一个可编译、可调试、可修改的系统级程序。理解JVM原理不能止步于内存模型或GC算法等概念,而需深入OpenJDK源码,掌握从Java字节码执行、类加载、垃圾回收到JIT编译的全链路机制。通过GDB调试HotSpot、修改C++源码并重新构建JDK,开发者能真正验证理论、定位线上OOM与GC异常,并支撑JVM定制化与故障诊断工具开发。本文聚焦Linux环境下OpenJDK 21源码构建、HotSpot调试与真实问题闭环解决,覆盖源码

weixin_34175509的博客 315

Java-17 深入浅出MyBatis Mapper Proxy 源码解析:从 getMapper 到 invoke 的完整链路

MyBatis Mapper Proxy 是 MyBatis 数据访问层最核心的"魔法":开发者只声明一个没有任何实现类的接口,就能像调用本地方法一样调用 SQL。本文以 2026 年主流的 MyBatis 3.5.x(3.5.16+,Java 8+/17+)源码为蓝本,逐行拆解 `sqlSession.getMapper(UserMapper.class)` 背后的完整链路:第一步,`DefaultSqlSession.getMapper` 把请求转发到 `Configuration.getMapper`

谢谢你的喜欢 我们一起无限进步 2852

OpenJDK 17源码解剖实战:从java -version到汇编指令

JVM不是黑盒,而是可追踪、可调试、可修改的运行时系统;理解其本质需回归OpenJDK源码——尤其LTS版本17,具备稳定模块边界、高覆盖率调试符号与成熟构建链。HotSpot源码遵循CLI→Runtime→Interpreter→Compiler四层穿透结构,每层对应真实内存操作、寄存器状态与汇编输出;结合GDB断点、PrintAssembly与jol工具,工程师能将‘new Object()’映射到TLAB分配、Mark Word写入及CPU缓存行对齐等物理细节。这种源码级剖析能力,是解决OOM、GC异

weixin_33755649的博客 281

KernelSU 完整指南:从设备检测到故障处理,Android 内核级 Root 实操教程

KernelSU 是一款运行在内核态、直接在 kernel 空间中授予应用 root 权限的 Android 内核级 Root 方案。本文带你走通设备支持判断、GKI 与 LKM 两种安装方式的选择、最小化安装步骤和常见故障处理,帮助新手平稳完成第一次内核级 Root。 如果你曾经刷过内核然后停在开机画面,问题多半不出在工具本身,而在刷机前的两件事:镜像版本不匹配、没有备份。所以下面先把判断点讲

gitblog_00667的博客 936
上一篇: JDK1.8源码阅读(5)--ThreadLocal/Enum/Throwable
下一篇: SpringMVC源码解析笔记(1)
jacobbbbbbbb
博客等级 码龄7年 6粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值