⑴ java 中的注解有哪些用处
Java 中的注解主要有以下几种用途:
1. 标注数据:用于标注类、方法、变量、参数等元素,以便在编译、运行时对它们进行处理。例如,可以使用注解来标记需要序列化的属性、需要进行单元测试的方法等。
2. 生成文档:通过注解可以自动生成代码文档,方便开发者查看和使用。例如,Spring 框架中的 @RequestMapping、@GetMapping、@PostMapping 等注解可以自动生成 API 文档。
3. 控制程序流程:注解可以用于控制程序的执行流程,例如,可以使用 @Around 注解来实现拦截器,使用 @Transactional 注解来实现事务管理。
4. 代码简化:注解可以帮助开发者编写更简洁的代码,减少重复代码和模板化的代码。例如,JUnit 框架中的 @Test、@Before、@After 等注解可以让开发者更方便地编写测试用例。
5. 配置管理:注解可以用于配置管理,例如,使用 @Configuration、@Bean、@Component、@Service、@Repository 等注解来定义 Spring 容器中的组件和依赖关系。
6. 编译时检查:注解可以在编译时对代码进行检查,例如,使用 @Autowired、@NotNull、@Size 等注解来检查代码的正确性和安全性。
7. 运行时处理:注解可以在运行时对代码进行处理,例如,使用 AOP(面向切面编程)框架中的注解来实现横切关注点的处理。
⑵ Java编译时注解和运行时注解有什么区别
重写,重载,泛型,分别是在运行时还是编译时执行的
1. 方法重载是在编译时执行的,因为,在编译的时候,如果调用了一个重载的方法,那么编译时必须确定他调用的方法是哪个。如:
当调用evaluate("hello")时候,我们在编译时就可以确定他调用的method #1.
2.
方法的重写是在运行时进行的。这个也常被称为运行时多态的体现。编译器是没有办法知道它调用的到底是那个方法,相反的,只有在jvm执行过程中,才知晓到底是父子类中的哪个方法被调用了当有如下一个接口的时候,我们是无法确定到底是调用父类还是子类的方法
3.
泛型(类型检测),这个发生在编译时。编译器会在编译时对泛型类型进行检测,并吧他重写成实际的对象类型(非泛型代码),这样就可以被JVM执行了。这个过程被称为"类型擦除"。
类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。
类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下:
1). 将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
2). 移除所有的类型参数。
在编译后变成:
4. 注解。注解即有可能是运行时也有可能是编译时。
如java中的@Override注解就是典型的编译时注解,他会在编译时会检查一些简单的如拼写的错误(与父类方法不相同)等
同样的@Test注解是junit框架的注解,他是一个运行时注解,他可以在运行时动态的配置相关信息如timeout等。
5. 异常。异常即有可能是运行时异常,也有可能是编译时异常。
RuntimeException是一个用于指示编译器不需要检查的异常。RuntimeException
是在jvm运行过程中抛出异常的父类。对于运行时异常是不需要再方法中显示的捕获或者处理的。
已检查的异常是被编译器在编译时候已经检查过的异常,这些异常需要在try/catch块中处理的异常。
6. AOP. Aspects能够在编译时,预编译时以及运行时使用。
1).
编译时:当你拥有源码的时候,AOP编译器(AspectJ编译器)能够编译源码并生成编织后的class。这些编织进入的额外功能是在编译时放进去的。
2). 预编译时:织入过程有时候也叫二进制织入,它是用来织入到哪些已经存在的class文件或者jar中的。
3). 运行时:当被织入的对象已经被加载如jvm中后,可以动态的织入到这些类中一些信息。
7. 继承:继承是编译时执行的,它是静态的。这个过程编译后就已经确定
8. 代理(delegate):也称动态代理,是在运行时执行。