Java注解(详解),零基础入门到精通,收藏这篇就够了

Java注解详解:从基础到高级应用 在Java中,注解通过@interface关键字定义。注解可以应用于类、方法、字段、参数等程序元素。自定义注解允许开发者定义自己的注解类型,以满足特定的需求。自定义注解通过@interface关键字定义,可以包含元素(成员变量)和默认值。Retention;Target; 阅读详情

一、注解概述

1.什么是注解?

注解是JDK1.5才引入的。

注解可以标注在 类上,属性上,方法上 等。

注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。

2.注解与注释

**注释:**给程序员看的,编译器编译时会忽略注释。

注解:给编译器看的,或给其它程序看的,程序根据有没有这个注解来决定不同的处理方式。

3.注解的重要性

框架是如何实现的:框架 = 反射 + 注解 + 设计模式。

二、Java预置注解

1.标记已过时的注解@Deprecated

用来标记过时的元素,在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的类、过时的方法、过时的属性等。

\* JDK的内置注解:@Deprecated
\* 1. 被这个注解标注的元素已过时。
\* 2. 这个注解是给编译器看的。编译器看到这个注解之后会有警告提示信息。
\* 3. 经过测试 @Deprecated 注解可以标注的元素很多,例如:类上,方法上,属性上....

2.标记方法重写的注解@Override

修饰实例方法,则该方法必须是个重写方法,否则就会编译失败。

\* JDK内置的注解:@Override
\*      1. 给编译器看的。
\*      2. 这个注解标注实例方法,被标注的方法必须是重写父类的方法。
\*      3. 这个注解就是在编译阶段进行方法检查的,检查这个方法是否重写了父类方法,如果没有重写父类方法,则报错。
\*      4. 通过测试这个@Override注解只能使用在实例方法上。其他位置不能应用。

3.抑制警告的注解@SuppressWarnings

@SuppressWarnings(抑制警告的注解):在实际开发中,建议尽量不要忽略警告,而是真正的去解决警告。

@SuppressWarnings(“rawtypes”):抑制未使用泛型的警告

@SuppressWarnings(“resource”):抑制未关闭资源的警告

@SuppressWarnings(“deprecation”):抑制使用了已过时资源时的警告

@SuppressWarnings(“all”):抑制所有警告

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Java内置注解:@SuppressWarnings
 *      1. 主要作用是:抑制警告。
 *      2. 该注解常见的属性值:
 *          rawtypes:抑制未使用泛型的警告
 *          resource: 抑制未关闭资源的警告
 *          deprecation: 抑制使用了已过时资源时的警告
 *          all:抑制所有警告
 */
@SuppressWarnings("all")
public class AnnotationTest03 {
    public static void main(String[] args) throws Exception{

        //@SuppressWarnings("rawtypes")
        List list = new ArrayList();

        //@SuppressWarnings("resource")
        FileInputStream in = new FileInputStream("e:/file.txt");

        //@SuppressWarnings("deprecation")
        MyClass1 myClass1 = new MyClass1();

    }
}

4.函数式接口注解@FunctionalInterface

“函数式接口”的注解,这个是 JDK1.8 版本引入的新特性。使用@FunctionalInterface标注的接口,则**该接口就有且只能存在一个抽象方法,**否则就会发生编译错误。(注意:接口中的默认方法或静态方法可以有多个。)

\* 关于Java内置注解:@FunctionalInterface
\*      1. 这个注解是专门用来标注接口的。
\*      2. 被标注的接口必须是一个函数式接口,如果不是函数式接口,则编译器报错。
\*      3. 这个注解也是给编译器看的。
\*      4. 什么是函数式接口?
\*          如果这个接口中抽象方法只有一个(有且仅有一个)。称为函数式接口。
\*      5. 被 @FunctionalInterface 标注的接口中,允许有多个默认方法和静态方法。
/**
 * 关于Java内置注解:@FunctionalInterface
 *      1. 这个注解是专门用来标注接口的。
 *      2. 被标注的接口必须是一个函数式接口,如果不是函数式接口,则编译器报错。
 *      3. 这个注解也是给编译器看的。
 *      4. 什么是函数式接口?
 *          如果这个接口中抽象方法只有一个(有且仅有一个)。称为函数式接口。
 *      5. 被 @FunctionalInterface 标注的接口中,允许有多个默认方法和静态方法。
 */
public class AnnotationTest04 {
}

@FunctionalInterface
interface Flyable {
    void fly();

    //void run();

    default void run(){
        System.out.println("默认方法是可以的");
    }

    static void doSome(){
        System.out.println("静态方法");
    }
}

三、自定义注解和使用注解

1.自定义注解

自定义注解也属于引用数据类型

使用 @interface 来定义注解。

默认情况下注解可以出现在类上、方法上、属性上、构造方法上、方法参数上等…

所有自定义的注解,它的父类是:java.lang.annotation.Annotation

示例:

自定义的注解:@interface MyAnnotation

/**
 * 自定义的注解。(以下这是注解的定义过程!!!!!)
 */
public @interface MyAnnotation {
}

以下是使用注解的过程!!!!!!

/**
 * 以下是使用注解的过程!!!!!!
 */
@MyAnnotation
public class AnnotationTest05 {//类上能用注解
    @MyAnnotation
    private String name;//属性(字段)上能用注解

    @MyAnnotation
    public void doSome(){//方法上能用注解

    }

    //方法参数上能用注解
    public void doOther(@MyAnnotation String name, @MyAnnotation String password){

    }

    //方法的局部变量上能用注解
    public void toDo(
            @MyAnnotation
            String name,
            @MyAnnotation
            String password){

    }
}

2.注解也可以定义属性

注解也可以定义属性,不过属性定义时,属性名后面必须加一个小括号。

属性的类型只能是:

byte,short,int,long,float,double,boolean,char

String、Class、枚举类型、注解类型

以上所有类型的一维数组形式

示例:

季节的枚举类型:Season

/**
 * 季节的枚举类型
 */
public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

自定义的注解:@interface MyAnnotation

/**
 * 自定义的注解。(以下这是注解的定义过程!!!!!)
 */
public @interface MyAnnotation {
}
\* 注解也可以定义属性,但是属性定义时有要求,属性名后面必须添加:()
\* 语法:
\*      属性的类型 属性的名字();

自定义的注解:@interface DataBaseInfo

/**
 * 这是一个数据库信息的注解(自定义的注解)
 */
public @interface DataBaseInfo {
    /**
     * 注解也可以定义属性,但是属性定义时有要求,属性名后面必须添加:()
     * 语法:
     *      属性的类型 属性的名字();
     */
    String driver() default "com.mysql.cj.jdbc.Driver"; // 使用 default 关键字来指定属性的默认值。
    String url();
    String user();
    String password();

    byte b() default 0;
    short s() default 0;
    int i() default 0;
    long l() default 0L;
    float f() default 0.0F;
    double d() default 0.0;
    boolean flag() default false;
    char c() default '0';
    Class clazz() default String.class;
    Season season() default Season.SPRING;
    MyAnnotation myAnnotation();

    /**
     * 可以是一维数组形式
     * @return
     */
    String[] names();

    // 注解的属性的数据类型,必须是以上的几种类型,或者这几种类型的一维数组,不能是其他类型。
    //Object obj();
}

使用自定义的注解:@DataBaseInfo

/**
 * 使用自定义的注解:@DataBaseInfo
 */
public class AnnotationTest06 {

    // 语法规则:如果这个注解中有属性,那么使用的时候,必须给属性赋值。没有赋值则报错。
    // 除非你定义注解的时候给属性指定了默认值。
    // 怎么给属性赋值?语法:@DataBaseInfo(属性名=值,属性名=值,属性名=值,属性名=值,属性名=值)
    @DataBaseInfo(
            //driver="oracle.jdbc.driver.OracleDriver",    //由于指定了默认值,所以不用写了
            url="jdbc:mysql://localhost:3306/powernode",
            user="root",
            password="123456",
            myAnnotation=@MyAnnotation,
            names={"zhangsan", "lisi", "wangwu"},
            flag=true,
            i=100,
            clazz=Integer.class,
            season=Season.WINTER)
    public void connDB(){

    }

}

3.注解的使用

注解在使用时必须给属性赋值,除非你使用了default关键字为属性指定了默认值。

如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写。

如果属性是一个数组,使用注解时,数组值只有一个,数组的大括号是可以省略的。

自定义的注解:@interface Table

public @interface Table {

    /**
     * 有一个属性,并且这个属性的名字是value
     */
    //String value();

    String[] value();
}
//@Table(value="t_user")
// 如果属性名是value的话, 在使用注解的时候,该属性名可以省略。
//@Table("t_user")
//@Table(value={"t_user1", "t_user2"})
// value可以省略。
//@Table({"t_user1", "t_user2"})
//@Table({"t_user"})
@Table("t_user")
public class AnnotationTest07 {

    @SuppressWarnings("all")
    public static void main(String[] args) {

    }
}

四、元注解

用来标注注解的注解叫做元注解。(也是JDK内置的注解。)

常用的元注解:

@Retention:设置注解的保持性

@Target:设置注解可以出现的位置

@Documented:设置注解是否可以生成到帮助文档中

@Inherited:设置注解是否支持继承

@Repeatable:设置注解在某一个元素上是否可以重复使用(Java8的新特性。)

1.设置注解的保持性@Retention

Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期),字节码(类加载)或者运行时(JVM中运行)。

在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期。

@Retention(RetentionPolicy.SOURCE):注解仅存在于源代码中,在字节码文件中不包含。

@Retention(RetentionPolicy.CLASS):注解在字节码文件中存在,但运行时无法获得(默认)。

@Retention(RetentionPolicy.RUNTIME):注解在字节码文件中存在,且运行时可通过反射获取。

示例:

自定义的注解:@interface MyAnnotation

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

//@Retention(value= RetentionPolicy.SOURCE) // @MyAnnotation 注解保留在源码中。
//@Retention(value= RetentionPolicy.CLASS) // @MyAnnotation 注解保留在字节码中,这是默认的行为,但不能被反射。
//@Retention(value= RetentionPolicy.RUNTIME) // @MyAnnotation 注解保留在字节码中,并且在运行时可以被反射。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}

测试类Test:

import java.lang.annotation.Annotation;

@MyAnnotation // 这个注解会被保留到字节码中,并且在运行时可以被反射。
public class Test {

    public static void main(String[] args) {

        // 获取这个类
        Class<Test> testClass = Test.class;

        // 获取这个类上的注解
        //MyAnnotation annotation = testClass.getAnnotation(MyAnnotation.class);
        // java.lang.annotation.Annotation是所有注解的老祖宗。
        Annotation annotation = testClass.getAnnotation(MyAnnotation.class);

        System.out.println(annotation);
    }
}

运行结果:

2.设置注解可以出现的位置:@Target

用于描述注解可以使用的位置,该注解使用ElementType枚举类型用于描述注解可以出现的位置, ElementType有如下枚举值:

自定义的注解:@interface MyAnnotation

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

//@Target(value={ElementType.METHOD})
//@Target(ElementType.METHOD) // 限定注解只能出现在方法上
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD})
public @interface MyAnnotation {
}

测试类:

@MyAnnotation
public class Test {

    @MyAnnotation
    int num = 100;

    @MyAnnotation
    public static void main(String[] args) {

    }
}

3.设置注解是否可以生成到帮助文档中:@Documented

Documented的英文意思是文档。

使用javadoc.exe工具可以从程序源代码中抽取类、方法、属性等注释形成一个源代码配套的API帮助文档,而该工具抽取时默认不包括注释内容。

如果使用的注解被@Documented标注,那么该注解就能被javadoc.exe工具提取到API文档。

自定义的注解:@interface MyAnnotation

import java.lang.annotation.Documented;

@Documented//这个注解可以被文档化了
public @interface MyAnnotation {
}

Test类:

@MyAnnotation
public class Test {

    @MyAnnotation
    public static int num=100;

    @MyAnnotation
    public void doSome(){

    }

    @MyAnnotation
    public Test(){

    }
}

4.设置注解是否支持继承:@Inherited

Inherited的英文意思是继承,但是这个继承和我们平时理解的继承大同小异,一个被@Inherited注解了的注解修饰了一个父类,则它的子类也继承了父类的注解。

自定义的注解:@interface MyAnnotation

import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;


@Retention(RetentionPolicy.RUNTIME)
@Inherited // 表示 @MyAnnotation注解能够被继承
public @interface MyAnnotation {
}

父类Animal:

@MyAnnotation
public class Animal {
}

子类Cat:

public class Cat extends Animal{
}

测试类:


public class Test {
    public static void main(String[] args) {
        //Cat类自动继承了父类的注解
        Class<Cat> catClass = Cat.class;
        MyAnnotation annotation = catClass.getAnnotation(MyAnnotation.class);
        System.out.println(annotation);
    }
}

运行结果;

5.设置注解在某一个元素上是否可以重复使用(Java8的新特性。):@Repeatable

Repeatable表示可重复的含义,该注解属于JDK1.8版本的新特性。

自定义的注解:@interface Author

@Repeatable(Authors.class)
public @interface Author {

    /**
     * 作者的名字
     * @return 作者的名字
     */
    String name();
}

自定义的注解:@interface Authors

public @interface Authors {

    Author[] value();

}

测试类Test;

public class Test {

    @Author(name = "张三")
    @Author(name = "李四")
    public void doSome(){

    }

}

五、反射注解

自定义的注解:@interface Annotation1

import java.lang.annotation.*;

import java.lang.annotation.*;

/**
 * 这是一个自定义注解 Annotation1 的定义类。
 * 该注解可以用于类、字段和方法上,并且在运行时可以通过反射机制获取,同时具有继承性和文档化特性。
 */
// @Target 注解用于指定自定义注解可以应用的目标元素类型
// ElementType.TYPE 表示可以应用于类、接口(包括注解类型)或枚举声明
// ElementType.FIELD 表示可以应用于字段声明(包括枚举常量)
// ElementType.METHOD 表示可以应用于方法声明
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
// @Retention 注解用于指定注解的保留策略
// RetentionPolicy.RUNTIME 表示注解将保留到运行时,这样可以在运行时通过反射机制获取注解信息
@Retention(RetentionPolicy.RUNTIME)
// @Inherited 注解表明该注解具有继承性
// 如果一个使用了此注解的类被继承,那么它的子类也会继承该注解
@Inherited
// @Documented 注解表示该注解会被包含在 Javadoc 文档中
@Documented
// 定义一个自定义注解 Annotation1
public @interface Annotation1 {
    /**
     * 定义注解的一个属性 name,类型为 String。
     * 该属性用于存储一个字符串值,默认值为空字符串。
     *
     * @return 注解的 name 属性值
     */
    String name() default "";

    /**
     * 定义注解的一个属性 age,类型为 int。
     * 该属性用于存储一个整数值,默认值为 0。
     *
     * @return 注解的 age 属性值
     */
    int age() default 0;
}

自定义的注解:@interface Annotation2

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Annotation2 {
    String email() default "";
    double price() default 0.0;
}

Myclass类:

@Annotation1(name="zhangsan22222", age=3333)
@Annotation2(email="zhangsan@123.com", price = 3000.5)
public class MyClass {

    @Annotation1
    @Annotation2
    String s;

    @Annotation1
    @Annotation2
    public void doSome(){

    }

}

测试类:

public class Test {
    public static void main(String[] args) {
        // 获取类
        Class<MyClass> mcClass = MyClass.class;

        // 获取类上的所有注解
        /*Annotation[] annotations = mcClass.getAnnotations();
        for(Annotation a : annotations){
            System.out.println(a);
        }*/

        // 判断该类上是否存在这个注解
        if(mcClass.isAnnotationPresent(Annotation1.class)){
            // 获取指定的某个注解
            Annotation1 a1 = mcClass.getAnnotation(Annotation1.class);
            // 访问注解对象中的属性
            System.out.println(a1.name());
            System.out.println(a1.age());
        }

        if(mcClass.isAnnotationPresent(Annotation2.class)){
            Annotation2 a2 = mcClass.getAnnotation(Annotation2.class);
            System.out.println(a2.email());
            System.out.println(a2.price());
        }

    }
}

运行结果:

六、递归+反射+注解的综合练习

储备知识:

数据库是用来组织数据的,数据库使用表来组织数据,一个数据库表如图所示。

一张表应该有表名,例如:t_user

一张表中应该有很多字段,每个字段有字段名和数据类型,例如age字段是int类型。

数据库中整数对应的类型是:int。字符串对应的类型是:varchar。

建表语句如下:

create table t_user(

id int,

name varchar,

age int,

email varchar );

编写程序扫描一个包下所有的类,凡是被 @Table 注解标注的类都要生成一条建表语句,表名在 @Table 注解中指定。

被@Table 标注的类中的属性被 @Column 注解标注,在 @Column注解中描述字段的名称和字段的数据类型。

1.a包下

⑴.b包:VIp
import annotation.Column;
import annotation.Table;


@Table("t_vip")
public class Vip {
    @Column(name = "id")
    private String id;
    //@Column(name = "name")
    private String name;
    //@Column(name = "grade")
    private String grade;
}

⑵.User类
import annotation.Column;
import annotation.Table;

/**
 * ClassName: User
 */
@Table("t_user")
public class User {
    @Column(name = "uid")
    private String userid;
    @Column(name = "uname")
    private String username;
    @Column(name = "pwd")
    private String password;
    @Column(name = "age", type = "int")
    private int age;
    private String email;
}

2.annotion包下

⑴.注解:@interface Column
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 * Description:
 *          该注解用来标注一个类中的属性,被标注的属性参与建表。
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    /**
     * 字段的名字
     * @return 字段的名字
     */
    String name();

    /**
     * 字段的数据类型
     * @return 字段的数据类型
     */
    String type() default "varchar";
}
⑵.注解:@interface Table
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * ClassName: Table
 * Description:
 *      被 @Table 注解标注的类,要生成建表语句。
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    /**
     * 用来指定表的名字
     * @return 表的名字
     */
    String value();
}

3.c包下

⑴.Customer类
import annotation.Column;
import annotation.Table;


@Table("t_customer")
public class Customer {
    @Column(name = "cid")
    private String cid;
    @Column(name = "name")
    private String name;
    @Column(name = "age", type = "int")
    private int age;
    @Column(name = "addr")
    private String address;
}

4.d包下

测试类Test:

import annotation.Column;
import annotation.Table;

import java.io.File;
import java.lang.reflect.Field;


public class Test {

    private static String classpathRoot;

    private static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
        // 扫描类路径当中所有的文件,找到所有的.class结尾的文件
        // 通过.class文件的路径找到对应的全限定类名(全限定类名是带包名的。)
        classpathRoot = Thread.currentThread().getContextClassLoader().getResource(".").getPath();
        //System.out.println("类路径的根:" + classpathRoot);
        // 创建File对象
        File file = new File(classpathRoot);
        // 调用方法来生成建表语句
        generateCreateStatement(file);
        System.out.println(sb);
    }

    /**
     * 通过这个方法,来生成建表语句
     *
     * @param file 起初的这个file代表的是类的根目录
     */
    private static void generateCreateStatement(File file) {
        if (file.isFile()) { // file是一个文件的时候,递归结束
            //System.out.println(file.getAbsolutePath());
            String classFileAbsolutePath = file.getAbsolutePath();
            if (classFileAbsolutePath.endsWith(".class")) {
                // 程序执行到这里,表示文件一定是一个字节码文件
                //System.out.println(classFileAbsolutePath);
                String className = classFileAbsolutePath.substring(classpathRoot.length() - 1, classFileAbsolutePath.length() - ".class".length()).replace("\\", ".");
                //System.out.println(className);

                try {
                    // 获取类
                    Class<?> clazz = Class.forName(className);
                    // 判断类上面是否有@Table注解
                    if(clazz.isAnnotationPresent(Table.class)){
                        Table tableAnnotation = clazz.getAnnotation(Table.class);
                        // 获取到表的名字
                        String tableName = tableAnnotation.value();
                        System.out.println(tableName);
                        sb.append("create table ");
                        sb.append(tableName);
                        sb.append("(");
                        // 获取所有的属性
                        Field[] fields = clazz.getDeclaredFields();
                        for(Field field : fields){
                            // 判断字段上是否存在 @Column 注解
                            if(field.isAnnotationPresent(Column.class)){
                                Column columnAnnotation = field.getAnnotation(Column.class);
                                // 字段名
                                String columnName = columnAnnotation.name();
                                System.out.println(columnName);
                                sb.append(columnName);
                                sb.append(" ");
                                // 字段的类型
                                String columnType = columnAnnotation.type();
                                System.out.println(columnType);
                                sb.append(columnType);
                                sb.append(",");
                            }
                        }
                        // 删除当前sb中的最后一个逗号
                        sb.deleteCharAt(sb.length() - 1);
                        sb.append(");\n");
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }

            }
            return;
        }
        File[] files = file.listFiles();
        for (File f : files) {
            //System.out.println(f.getAbsolutePath());
            generateCreateStatement(f);
        }
    }
}

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

在这里插入图片描述

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版优快云大礼包:《AGI大模型学习资源包》免费分享

Java注解从入门到精通 Java注解从入门到精通 - 摘要 本文全面讲解Java注解技术,涵盖从基础概念到高级应用。主要内容包括: 基础部分: 注解定义:Java代码中的元数据标签,用于提供附加信息 与注释的区别:注解可影响程序行为而不仅用于说明 三大作用:编译检查、代码分析、文档生成 核心注解: 内置注解:@Override、@Deprecated、@SuppressWarnings等详解 元注解:@Retention、@Target等控制注解行为的元数据 高级应用: 自定义注解语法与实现 注解处理器开发与反射读取 实际应用场景 阅读详情

相关推荐

java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

这篇文章主要总结我之前所学过的框架以及学习路线 从实打实的零基础到框架再到项目 之后实习工作 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 也在这篇博客中记录我的学习笔记 以及在笔记中遇到的配置安装、代码bug等错误 都从零开始摸索并且记录了下来 后期也会一直实时更新 一键三连防丢失

码农研究僧的博客 3万+

Java-注解详解

Retention:注解的保留策略。该注解指明了被它所注解的注解被保留的时间长短。@Retention 包含一个名为 value 的成员变量,该 value 成员变量是 RetentionPolicy,RetentionPolicy 是枚举类型,值有如下几个:RetentionPolicy.SOURCE:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视,不记录在 class 文件中。RetentionPolicy.CLASS:注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。

yueerba126的博客 9859

【SoloPi】SoloPi使用2-功能使用,录制回放

Soloπ是什么 Soloπ是一个无线化、非侵入式的Android自动化工具,公测版拥有录制回放、性能测试、一机多控三项主要功能,能为测试开发人员节省宝贵时间。 录制回放功能 Soloπ拥有录制操作的能力,用户只需要通过Soloπ执行用例步骤,Soloπ就能够将用户的操作记录下来,并且支持在各个设备上进行回放,这一切都能够在手机上独立完成。 ...

q_Catherine的博客 5829

java标注

Java注解是一个很重要的知识点,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。 掌握好Java注解有利于学习框架底层实现。@mikechen Java注解定义 Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称为元数据)。 Java注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置

Code Writers 2142

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

Open5GS实战:从零搭建树莓派5G核心网并与商用终端联调

本文详细介绍了如何在树莓派5上从零开始搭建基于Open5GS的5G核心网,涵盖系统准备、依赖安装、源码编译、关键配置修改及服务启动全流程。通过整合SDR基站与商用终端进行端到端联调,为开发者和研究者提供了一个低成本、可实践的5G网络实验平台,助力物联网与边缘计算应用的本地化测试与验证。

weixin_29194255的博客 160

Java注解「详解」

注解(Annotation)是Java语言中的一种特殊语法结构,它可以在代码中嵌入元数据(metadata),用于一些特殊的标记和说明。注解可以在编译时被读取,并在运行时使用。@注解名称(属性名1=属性值1, 属性名2=属性值2, ...)其中,符号表示这是一个注解,注解名称是一个标识符,类似于Java中的类名或接口名。注解名称后面的括号中可以包含零个或多个属性,属性的格式是属性名=属性值,多个属性之间用逗号分隔。// ...此处使用了@Deprecated。

weixin_56433857的博客 7815

Xilinx VU+系列多DIE FPGA时序约束与跨DIE信号优化策略

本文深入探讨了Xilinx VU+系列多DIE FPGA的时序约束与跨DIE信号优化策略。针对2.5D/3D封装技术带来的时序挑战,详细解析了SLR区域约束、Laguna寄存器配置及跨时钟域约束等关键技术,提供了实用的TCL脚本和RTL优化示例,帮助开发者有效提升设计性能和时序收敛效率。

weixin_29209801的博客 654

Java——注解(Annotation)

注解是使用 @interface 关键字定义的,并且默认继承自Annotation接口。用于标识一个方法是重写父类的方法。该注解只能用于方法。@Override表示某个元素(类、方法、字段等)已经过时,不建议使用。仍然可以使用,但是不建议使用,通常是因为这个元素已经被替换为较新的功能。在使用这个类时,会显示:可以看到这个类被线划掉了,说明这个类已经过时。用于抑制编译器发出的警告。int i;

Stewie Lee的博客 1万+

描述符链表(Descriptor Chain)是什么?

描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。

guigenyi的专栏 775

中兴FTTR光猫变简易OLT:低成本搭建全光监控与局域网实战指南

本文详细介绍了如何将中兴FTTR光猫改造为简易OLT设备,实现低成本全光监控与局域网扩展。通过LOID认证、桥接模式设置及终端数破解,用户可利用二手设备搭建高性能光纤网络,适用于远程监控和长距离组网场景,显著降低部署成本。

chair的专栏 2035

Java注解入门到精通,这一篇就够了

一、为什么要学注解? ​ 在日常开发中,基本都是在使用别人定义或是各种框架的注解,比如Spring框架中常用的一些注解:@Controller、@Service、@RequestMapping,以此来实现某些功能,但是却不知道如何实现的,所以如果想学习这些框架的实现原理,那么注解就是我们必知必会的一个点。其次,可以利用注解来自定义一些实现,比如在某个方法上加一个自定义注解,就可以实现方...

KimZing的博客 3万+

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 849

Java从入门到精通技术详解,零基础入门到精通,收藏这篇就够了

Java是由Sun Microsystems公司于1995年推出的一种面向对象的编程语言。它具有平台无关性、安全性、多线程和动态性等特点。Java程序通过编译器转换为字节码,然后由Java虚拟机(JVM)解释执行。第一部分介绍了Java的基础知识,包括Java语言概述、Java开发环境搭建、Java基本语法和Java面向对象编程。通过这些内容,我们展示了Java编程的基本概念和步骤。在接下来的部分,我们将进一步探讨Java的高级特性和高级主题,以及如何利用这些技术解决实际问题。

Libra1313的博客 1450

[QMT量化交易小白入门]-六十九、ETF动量评分策略,历史年化收益率107%

C . bar_date } 跳过') returnC . bar_date } 跳过') returnC . bar_date } 跳过') return作用:如果当前不是回测模式且不是最后一根K线,则记录日志并跳过本次任务。这是为了避免在实时交易中对尚未完成的数据进行处理。

木头大左的博客 2230

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

原来 java 注解只是个标记,没什么本领,一文精通,值得收藏!

java里有个神奇的存在,注解,就是那个天天@别人的家伙,它到底是何方神圣啊?

二当家的白帽子 7813

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java——注解的详细解释,小白到精通,收藏这篇就够了

注解是使用 @interface 关键字定义的,并且默认继承自Annotation接口。用于标识一个方法是重写父类的方法。该注解只能用于方法。@Override表示某个元素(类、方法、字段等)已经过时,不建议使用。仍然可以使用,但是不建议使用,通常是因为这个元素已经被替换为较新的功能。在使用这个类时,会显示:可以看到这个类被线划掉了,说明这个类已经过时。用于抑制编译器发出的警告。int i;

Libra1313的博客 1233

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java注解,零基础入门到精通,收藏这篇就够了

Java注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。① 编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】③ 编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】注解是以‘@注解名标记注解单值注解完整注解三类。

Libra1313的博客 390

java深入理解泛型和注解,零基础入门到精通,收藏这篇就够了

Java 注解(Annotation)用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。Annotion(注解)是一个接口,程序可以通过反射来获取指定程序元素的Annotion对象,然后通过Annotion对象来获取注解里面的元数据。

Javachichi的博客 915

【hacker送书第8期】Java从入门到精通(第7版)

【hacker送书第8期】Java从入门到精通(第7版),欢迎大家参与!!!

hacker707的博客 9653

Java注解:从入门到精通

注解详细解读

qq_73698057的博客 1205

测试开发学习路线(非常详细)零基础入门到精通,收藏这篇就够了

大家好,我是洋子,一名测试开发工程师在测试行业,我们一般都听说过这3种岗位:测试工程师(功能测试),自动化测试工程师,测试开发工程师。目前在互联网大厂,基本都只招测试开发工程师,意味着做软件测试也需要具备代码能力对于测试开发这种近几年才在国内火起来的岗位,在市场上基本没有可供参考的学习路线,很多非计算机科班的同学想转行做软件测试拿高薪,却不知道怎么学习于是我花了快一个月的时间,整理出了测试开发的学习路线,供大家学习参考。

leah126的博客 4818

【hacker送书第4期】推荐4本Java必读书籍(各送一本)

【hacker送书第4期】推荐4本Java必读书籍(各送一本),欢迎大家参与

hacker707的博客 1万+

Java 注解与反射实战:自定义注解从入门到精通

Java注解是一种标记代码的机制,通过@interface关键字定义,可包含属性赋予其动态性。元注解(@Target、@Retention等)控制注解的作用范围和生命周期,其中RUNTIME级别的注解结合反射可实现动态逻辑(如权限校验)。反射通过getAnnotation()读取注解信息,驱动实际功能(如日志、ORM映射)。自定义注解广泛应用于框架(Spring、JPA)简化配置,体现声明式编程思想,提升代码灵活性。掌握注解+反射是进阶Java开发的关键技能。

qq_40303030的博客 3110

Java基础面试题——反射,零基础入门到精通,收藏这篇就够了

什么是反射?反射有什么优缺点?反射的应用场景?以 Java 为例,反射是指程序在运行时能够获取任意类的完整结构信息(包括属性、方法、构造器、注解等),并且能够动态调用该类的成员(创建对象、调用方法、修改私有属性)的机制,打破了类的编译期封装约束和类型固定性。

Libra1313的博客 749
上一篇: 2026最新版Java面试八股文大全_八股文java面试题,零基础入门到精通,收藏这篇就够了
下一篇: 基于JAVA实现的学生管理系统_学生管理系统java,零基础入门到精通,收藏这篇就够了
程序员_大白
博客等级 码龄5年 1万+粉丝 4001原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值