资讯详情

异常·反射·注解

📅 2026/10/18 3:41:35 | 华诺云谱 👁 阅读
异常·反射·注解
Java中的异常运行时异常和非运行时异常运行时异常是指自己的代码写的不够好边界情况没有处理好能够通过编译但是运行会报错。比如空指针数组越界非运行时异常是外部环境的问题比如要访问的文件被删除了SQL没连上去。编译都会欧保国throw和throwsthrow相当于一个能抛出异常的输出语句throws是写到方法上面的说这个方法里面可能存着某个异常但是我不处理留给掉用者处理。如果调用者向上一抛出的话就会给JVM处理结果就是直接报错程序停止运行如果有一个catch啦接住这个异常的话程序还会继续运行反射在运行时动态地获取类的信息属性、方法、构造器等并可以操作它们获取Class对象的三种方法// 方式一通过类名.class编译时就知道类型ClassUserc1User.class;// 方式二通过对象.getClass()运行时拿到对象才知道类型UserusernewUser();Class?c2user.getClass();// 方式三通过全限定类名字符串最灵活最常用Class?c3Class.forName(com.example.User);一个类在JVM里面只有同一个Class对象Class类的APIField字段操作字段的Method方法invoke来调用的Constructor构造器用来实例化的操作构造器来实例化Class?clazzClass.forName(com.example.User);// 获取无参构造器创建实例Constructor?noArgclazz.getDeclaredConstructor();Objectuser1noArg.newInstance();// 获取有参构造器Constructor?withArgclazz.getDeclaredConstructor(String.class,int.class);Objectuser2withArg.newInstance(张三,25);只有操作构造器才能来实例化注解注解是一种给代码添加元数据描述信息的方式它本身不影响代码逻辑但可以在编译期或运行时被读取和处理注解本质上就是接口// 你写的注解Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfaceMyAnnotation{Stringvalue();intage()default18;}反射编译后就是一个接口// 注解的本质是一个继承了 java.lang.annotation.Annotation 的接口publicinterfaceMyAnnotationextendsAnnotation{Stringvalue();intage();// default 18 在编译时由框架读取处理}元注解Target注解能用到哪里Target({ElementType.METHOD,ElementType.FIELD})publicinterfaceMyAnnotation{}Retention注解能活到什么时候源码(.java) → 字节码(.class) → JVM 加载到内存 SOURCE: ✅存在 ❌丢弃 ❌丢弃 CLASS: ✅存在 ✅存在 ❌丢弃 默认 RUNTIME: ✅存在 ✅存在 ✅存在 反射可用. Inherited — 子类是否继承父类的注解###自定义注解Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfaceMyAnnotation{// 带默认值的属性Stringvalue()default;// 可以有多个属性intpriority()default0;// 属性类型支持基本类型、String、Class、枚举、注解、以上类型的数组String[]tags()default{};}这个String value()是指变量value的类型是String没有任何意义MyAnnotation(valuetest,priority1,tags{a,b})publicvoiddoSomething(){}注解的处理方式运行时反射// 自定义注解Target(ElementType.METHOD)Retention(RetentionPolicy.RUNTIME)publicinterfaceRoute{Stringpath();}// 使用注解publicclassUserController{Route(path/user/list)publicStringlistUsers(){returnuser list;}Route(path/user/detail)publicStringgetUserDetail(){returnuser detail;}}// 运行时通过反射读取注解publicclassRouter{publicstaticvoidmain(String[]args)throwsException{Class?clazzUserController.class;for(Methodmethod:clazz.getDeclaredMethods()){// 判断方法上是否有 Route 注解if(method.isAnnotationPresent(Route.class)){Routeroutemethod.getAnnotation(Route.class);// 读取注解的属性值System.out.println(路径: route.path());System.out.println(方法: method.getName());// 可以把 path → method 的映射存起来实现路由}}}}
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑