23-java基础加强(反射、泛型、注解、动态代理)

简介: 一、反射1. 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime    Person.java—Person.class  à  类加载到内存 Person.class –> 创建对象 程序运行 2. Class 对象    在java中用一个Class对象来表示一个java类的class阶段    Class对象封装

一、反射

1. 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime

    Person.java—Person.class  à  类加载到内存 Person.class –> 创建对象 程序运行

 

2. Class 对象

    在java中用一个Class对象来表示一个java类的class阶段

    Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等

 

3. 反射

    反射就是获得一个java类的各个组成部分

    对第二个阶段进行解析

 

4. 反射的用法

    1)需要获得java类的各个组成部分,首先需要获得代表java类的 Class 对象

    获得Class对象的三种方式:

    Class.forName(classname) 用于做类加载

    obj.getClass()              用于获得对象的类型

    类名.class                   用于获得指定的类型,传参用

    Person.class String.class int.class  int[].class void.class

 

    2) 反射类的成员方法

    Class clazz = Person.class;

    Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});

    method.invoke();

   

    3) 反射类的构造函数

    Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})

    con.newInstance(params...)

 

    4) 反射类的属性

    Field field = clazz.getField(fieldName);

    field.setAccessible(true);  // 由于属性私有就不能直接访问了,所以需要取消java的访问权限检查

    field.setObject(value);

    field.getObject();

 

5. 反射用在哪里

    到底框架是什么?  框架就是将开发中大量重复的代码集中起来写个通用的程序

    框架就是用反射来实现的

    框架是一个通用的程序,这个程序是无法运行的,是缺少零部件的,零部件需要将来使用框架的人组装进来

    框架需要现在的类调用将来写的类

 

    框架是将来的程序员调用的,框架不能实现完整的功能,框架只是一些一些通用的代码

    框架要运行一定会依赖将来写的类

    现在写的类要调用将来写的类,我们先针对接口进行调用,将来的类需要实现接口,那么方法就固定了

    但是将来写的类的类名我们无法获知,这时就需要调用者通过配置文件告诉框架具体的类名

 

二、 泛型

1. 泛型是一种可变化的类型

    类型不确定,需要调用者来指定

   

2. 用途:

    一个类的多个成员方法用到的参数类型或返回值类型都是未知的类型,但又需要是同一个类型,就可将方法的

    参数类型定义为泛型,此泛型必须在类上先予以声明才能在方法中使用

 

    一个方法的多个参数和返回值需要是同一个类型,也可以用泛型来解决,在返回值前面声明泛型

 

3. 泛型的基本概念

以List<E>为例:<>念着typeof 例, List<String> 就是 List typeof String

List<E>中的E称为类型参数变量     方法定义参数形式参数 

List<Integer>中的Integer称为实际类型参数

整个List<E>称为泛型类型   GenericType

整个List<Integer>称为参数化的类型

 

 

4. 泛型的使用

    1)使用带泛型的类时,在创建对象时可以为泛型指定实际类型参数,指定的具体类型相当于给泛型传参

    2)子类在继承父类的时候,可以为父类定义的泛型指定实际类型参数

    class B<T>

    class A extends B<String>

    通过子类A获得的父类类型就是一个参数化的类型

    3)调用方法时传入参数的具体类型将作为方法中泛型的实际类型

 

三、注解

1. jdk中自带的三个注解

    @Deprecated 声明方法已过时

    @SuppressWarnings  取消编译器警告

    @Override  声明方法是继承自父类

 

2.  什么是注解

    注解就是java代码中的特殊标记,它用于告诉调用者类应该如何被运行

    注解相当于配置文件的功能

 

3. 自定义注解

使用 @interface 关键字可以声明一个注解

public @interface MyAnnotation1

 

注解中可以定义属性

String name default “aaa”;

 

value是注解中的特殊属性

注解中定义的属性如果名称为 value, 此属性在使用时可以省写属性名

 

4.元注解  元Annotation

元注解简单理解为 注解的注解

类似于描述一个注解的信息的配置文件

@Retention 指定注解的作用域

RetentionPolicy.SOURCE

RetentionPolicy.CLASS  default

RetentionPolicy.RUNTIME

 

@Target:指定注解用于修饰类的哪个成员.

@Target 包含了一个名为 value,类型为ElementType的成员变量。

 

@Inherited: 被它修饰的 Annotation 将具有继承性.

如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解

 

5. 反射注解

    在程序可以通过反射来获取注解中封装的值

 

四、动态代理

我们可以为某一个对象生成一个代理对象

代理对象要和被代理的对象实现同样的接口

代理对象的方法被调用时,我们可以做一些动作,再去调用真正被代理对象的方法

在代理对象中对用户的权限进行检查

 

所有的过滤器都可以用代理模式来解决

 

目录
相关文章
|
10天前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
44 7
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
97 43
Java学习十六—掌握注解:让编程更简单
|
16天前
|
Java 编译器 数据库
Java 中的注解(Annotations):代码中的 “元数据” 魔法
Java注解是代码中的“元数据”标签,不直接参与业务逻辑,但在编译或运行时提供重要信息。本文介绍了注解的基础语法、内置注解的应用场景,以及如何自定义注解和结合AOP技术实现方法执行日志记录,展示了注解在提升代码质量、简化开发流程和增强程序功能方面的强大作用。
51 5
|
21天前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
1月前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
53 14
|
1月前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
33 12
|
1月前
|
Java
Java的反射
Java的反射。
26 2
|
25天前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
|
2月前
|
设计模式 Java API
[Java]静态代理与动态代理(基于JDK1.8)
本文介绍了代理模式及其分类,包括静态代理和动态代理。静态代理分为面向接口和面向继承两种形式,分别通过手动创建代理类实现;动态代理则利用反射技术,在运行时动态创建代理对象,分为JDK动态代理和Cglib动态代理。文中通过具体代码示例详细讲解了各种代理模式的实现方式和应用场景。
31 0
[Java]静态代理与动态代理(基于JDK1.8)
|
2月前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
35 0
[Java]泛型