国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Lombok開發插件使用小技巧

電子工程師 ? 來源:CSDN技術社區 ? 作者:$碼出未來 ? 2021-06-12 18:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

0x01:Lombok簡介

Lombok 是一款 Java開發插件,使得 Java 開發者可以通過其定義的一些注解來消除業務工程中冗長和繁瑣的代碼,尤其對于簡單的 Java 模型對象(POJO)。在開發環境中使用 Lombok插件后,Java 開發人員可以節省出重復構建,諸如 hashCode 和 equals 這樣的方法以及各種業務對象模型的 accessor 和 toString 等方法的大量時間。對于這些方法,Lombok 能夠在編譯源代碼期間自動幫我們生成這些方法,但并不會像反射那樣降低程序的性能。

0x02:Lombok安裝

構建工具

Gradle

在 build.gradle 文件中添加 Lombok 依賴:

dependencies {

compileOnly ‘org.projectlombok1.18.10’

annotationProcessor ‘org.projectlombok1.18.10’

}

Maven

在 Maven 項目的 pom.xml 文件中添加 Lombok 依賴:

《dependency》

《groupId》org.projectlombok《/groupId》

《artifactId》lombok《/artifactId》

《version》1.18.10《/version》

《scope》provided《/scope》

《/dependency》

Ant

假設在 lib 目錄中已經存在 lombok.jar,然后設置 javac 任務:

《javac srcdir=“src” destdir=“build” source=“1.8”》

《classpath location=“lib/lombok.jar” /》

《/javac》

IDE

由于 Lombok 僅在編譯階段生成代碼,所以使用 Lombok 注解的源代碼,在 IDE 中會被高亮顯示錯誤,針對這個問題可以通過安裝 IDE 對應的插件來解決。這里不詳細展開,具體的安裝方式可以參考:

https://www.baeldung.com/lombok-ide

0x03:Lombok 詳解

注意:以下示例所使用的 Lombok 版本是 1.18.10

3.1 @Getter and @Setter

你可以使用 @Getter 或 @Setter 注釋任何類或字段,Lombok 會自動生成默認的 getter/setter 方法。

@Getter 注解

@Target({ElementType.FIELD, ElementType.TYPE})

@Retention(RetentionPolicy.SOURCE)

public @interface Getter {

// 若getter方法非public的話,可以設置可訪問級別

lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;

AnyAnnotation[] onMethod() default {};

// 是否啟用延遲初始化

boolean lazy() default false;

}

@Setter

@Target({ElementType.FIELD, ElementType.TYPE})

@Retention(RetentionPolicy.SOURCE)

public @interface Setter {

// 若setter方法非public的話,可以設置可訪問級別

lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC;

AnyAnnotation[] onMethod() default {};

AnyAnnotation[] onParam() default {};

}

使用示例

@Getter

@Setter

public class GetterAndSetterDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class GetterAndSetterDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

public GetterAndSetterDemo() {

}

// 省略其它setter和getter方法

public String getFirstName() {

return this.firstName;

}

public void setFirstName(String firstName) {

this.firstName = firstName;

}

}

Lazy Getter

@Getter 注解支持一個 lazy 屬性,該屬性默認為 false。當設置為 true 時,會啟用延遲初始化,即當首次調用 getter 方法時才進行初始化。

示例

public class LazyGetterDemo {

public static void main(String[] args) {

LazyGetterDemo m = new LazyGetterDemo();

System.out.println(“Main instance is created”);

m.getLazy();

}

@Getter

private final String notLazy = createValue(“not lazy”);

@Getter(lazy = true)

private final String lazy = createValue(“lazy”);

private String createValue(String name) {

System.out.println(“createValue(” + name + “)”);

return null;

}

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class LazyGetterDemo {

private final String notLazy = this.createValue(“not lazy”);

private final AtomicReference《Object》 lazy = new AtomicReference();

// 已省略部分代碼

public String getNotLazy() {

return this.notLazy;

}

public String getLazy() {

Object value = this.lazy.get();

if (value == null) {

synchronized(this.lazy) {

value = this.lazy.get();

if (value == null) {

String actualValue = this.createValue(“lazy”);

value = actualValue == null ? this.lazy : actualValue;

this.lazy.set(value);

}

}

}

return (String)((String)(value == this.lazy ? null : value));

}

}

通過以上代碼可知,調用 getLazy 方法時,若發現 value 為 null,則會在同步代碼塊中執行初始化操作。

3.2 Constructor Annotations

@NoArgsConstructor

使用 @NoArgsConstructor 注解可以為指定類,生成默認的構造函數,@NoArgsConstructor 注解的定義如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface NoArgsConstructor {

// 若設置該屬性,將會生成一個私有的構造函數且生成一個staticName指定的靜態方法

String staticName() default “”;

AnyAnnotation[] onConstructor() default {};

// 設置生成構造函數的訪問級別,默認是public

AccessLevel access() default lombok.AccessLevel.PUBLIC;

// 若設置為true,則初始化所有final的字段為0/null/false

boolean force() default false;

}

示例

@NoArgsConstructor(staticName = “getInstance”)

public class NoArgsConstructorDemo {

private long id;

private String name;

private int age;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class NoArgsConstructorDemo {

private long id;

private String name;

private int age;

private NoArgsConstructorDemo() {

}

public static NoArgsConstructorDemo getInstance() {

return new NoArgsConstructorDemo();

}

}

@AllArgsConstructor

使用 @AllArgsConstructor 注解可以為指定類,生成包含所有成員的構造函數,@AllArgsConstructor 注解的定義如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface AllArgsConstructor {

// 若設置該屬性,將會生成一個私有的構造函數且生成一個staticName指定的靜態方法

String staticName() default “”;

AnyAnnotation[] onConstructor() default {};

// 設置生成構造函數的訪問級別,默認是public

AccessLevel access() default lombok.AccessLevel.PUBLIC;

}

示例

@AllArgsConstructor

public class AllArgsConstructorDemo {

private long id;

private String name;

private int age;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class AllArgsConstructorDemo {

private long id;

private String name;

private int age;

public AllArgsConstructorDemo(long id, String name, int age) {

this.id = id;

this.name = name;

this.age = age;

}

}

@RequiredArgsConstructor

使用 @RequiredArgsConstructor 注解可以為指定類必需初始化的成員變量,如 final 成員變量,生成對應的構造函數,@RequiredArgsConstructor 注解的定義如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface RequiredArgsConstructor {

// 若設置該屬性,將會生成一個私有的構造函數且生成一個staticName指定的靜態方法

String staticName() default “”;

AnyAnnotation[] onConstructor() default {};

// 設置生成構造函數的訪問級別,默認是public

AccessLevel access() default lombok.AccessLevel.PUBLIC;

}

示例

@RequiredArgsConstructor

public class RequiredArgsConstructorDemo {

private final long id;

private String name;

private int age;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class RequiredArgsConstructorDemo {

private final long id;

private String name;

private int age;

public RequiredArgsConstructorDemo(long id) {

this.id = id;

}

}

3.3 @EqualsAndHashCode

使用 @EqualsAndHashCode 注解可以為指定類生成 equals 和 hashCode 方法, @EqualsAndHashCode 注解的定義如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface EqualsAndHashCode {

// 指定在生成的equals和hashCode方法中需要排除的字段列表

String[] exclude() default {};

// 顯式列出用于identity的字段,一般情況下non-static,non-transient字段會被用于identity

String[] of() default {};

// 標識在執行字段計算前,是否調用父類的equals和hashCode方法

boolean callSuper() default false;

boolean doNotUseGetters() default false;

AnyAnnotation[] onParam() default {};

@Deprecated

@Retention(RetentionPolicy.SOURCE)

@Target({})

@interface AnyAnnotation {}

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.SOURCE)

public @interface Exclude {}

@Target({ElementType.FIELD, ElementType.METHOD})

@Retention(RetentionPolicy.SOURCE)

public @interface Include {

String replaces() default “”;

}

}

示例

@EqualsAndHashCode

public class EqualsAndHashCodeDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class EqualsAndHashCodeDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

public EqualsAndHashCodeDemo() {

}

public boolean equals(Object o) {

if (o == this) {

return true;

} else if (!(o instanceof EqualsAndHashCodeDemo)) {

return false;

} else {

EqualsAndHashCodeDemo other = (EqualsAndHashCodeDemo)o;

if (!other.canEqual(this)) {

return false;

} else {

// 已省略大量代碼

}

}

public int hashCode() {

int PRIME = true;

int result = 1;

Object $firstName = this.firstName;

int result = result * 59 + ($firstName == null ? 43 : $firstName.hashCode());

Object $lastName = this.lastName;

result = result * 59 + ($lastName == null ? 43 : $lastName.hashCode());

Object $dateOfBirth = this.dateOfBirth;

result = result * 59 + ($dateOfBirth == null ? 43 : $dateOfBirth.hashCode());

return result;

}

}

3.4 @ToString

使用 @ToString 注解可以為指定類生成 toString 方法, @ToString 注解的定義如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface ToString {

// 打印輸出時是否包含字段的名稱

boolean includeFieldNames() default true;

// 列出打印輸出時,需要排除的字段列表

String[] exclude() default {};

// 顯式的列出需要打印輸出的字段列表

String[] of() default {};

// 打印輸出的結果中是否包含父類的toString方法的返回結果

boolean callSuper() default false;

boolean doNotUseGetters() default false;

boolean onlyExplicitlyIncluded() default false;

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.SOURCE)

public @interface Exclude {}

@Target({ElementType.FIELD, ElementType.METHOD})

@Retention(RetentionPolicy.SOURCE)

public @interface Include {

int rank() default 0;

String name() default “”;

}

}

示例

@ToString(exclude = {“dateOfBirth”})

public class ToStringDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class ToStringDemo {

String firstName;

String lastName;

LocalDate dateOfBirth;

public ToStringDemo() {

}

public String toString() {

return “ToStringDemo(firstName=” + this.firstName + “, lastName=” +

this.lastName + “)”;

}

}

3.5 @Data

@Data 注解與同時使用以下的注解的效果是一樣的:

@ToString

@Getter

@Setter

@RequiredArgsConstructor

@EqualsAndHashCode

@Data 注解的定義如下:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.SOURCE)

public @interface Data {

String staticConstructor() default “”;

}

示例

@Data

public class DataDemo {

private Long id;

private String summary;

private String description;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class DataDemo {

private Long id;

private String summary;

private String description;

public DataDemo() {

}

// 省略summary和description成員屬性的setter和getter方法

public Long getId() {

return this.id;

}

public void setId(Long id) {

this.id = id;

}

public boolean equals(Object o) {

if (o == this) {

return true;

} else if (!(o instanceof DataDemo)) {

return false;

} else {

DataDemo other = (DataDemo)o;

if (!other.canEqual(this)) {

return false;

} else {

// 已省略大量代碼

}

}

}

protected boolean canEqual(Object other) {

return other instanceof DataDemo;

}

public int hashCode() {

int PRIME = true;

int result = 1;

Object $id = this.getId();

int result = result * 59 + ($id == null ? 43 : $id.hashCode());

Object $summary = this.getSummary();

result = result * 59 + ($summary == null ? 43 : $summary.hashCode());

Object $description = this.getDescription();

result = result * 59 + ($description == null ? 43 : $description.hashCode());

return result;

}

public String toString() {

return “DataDemo(id=” + this.getId() + “, summary=” + this.getSummary() + “, description=” + this.getDescription() + “)”;

}

}

3.6 @Log

若你將 @Log 的變體放在類上(適用于你所使用的日志記錄系統的任何一種);之后,你將擁有一個靜態的 final log 字段,然后你就可以使用該字段來輸出日志。

@Log

private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j

private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);

@Log4j2

private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);

@Slf4j

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);

@XSlf4j

private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

@CommonsLog

private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);

3.7 @Synchronized

@Synchronized 是同步方法修飾符的更安全的變體。與 synchronized 一樣,該注解只能應用在靜態和實例方法上。它的操作類似于 synchronized 關鍵字,但是它鎖定在不同的對象上。synchronized 關鍵字應用在實例方法時,鎖定的是 this 對象,而應用在靜態方法上鎖定的是類對象。對于 @Synchronized 注解聲明的方法來說,它鎖定的是 或lock。@Synchronized 注解的定義如下:

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.SOURCE)

public @interface Synchronized {

// 指定鎖定的字段名稱

String value() default “”;

}

示例

public class SynchronizedDemo {

private final Object readLock = new Object();

@Synchronized

public static void hello() {

System.out.println(“world”);

}

@Synchronized

public int answerToLife() {

return 42;

}

@Synchronized(“readLock”)

public void foo() {

System.out.println(“bar”);

}

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class SynchronizedDemo {

private static final Object $LOCK = new Object[0];

private final Object $lock = new Object[0];

private final Object readLock = new Object();

public SynchronizedDemo() {

}

public static void hello() {

synchronized($LOCK) {

System.out.println(“world”);

}

}

public int answerToLife() {

synchronized(this.$lock) {

return 42;

}

}

public void foo() {

synchronized(this.readLock) {

System.out.println(“bar”);

}

}

}

3.8 @Builder

使用 @Builder 注解可以為指定類實現建造者模式,該注解可以放在類、構造函數或方法上。@Builder 注解的定義如下:

@Target({TYPE, METHOD, CONSTRUCTOR})

@Retention(SOURCE)

public @interface Builder {

@Target(FIELD)

@Retention(SOURCE)

public @interface Default {}

// 創建新的builder實例的方法名稱

String builderMethodName() default “builder”;

// 創建Builder注解類對應實例的方法名稱

String buildMethodName() default “build”;

// builder類的名稱

String builderClassName() default “”;

boolean toBuilder() default false;

AccessLevel access() default lombok.AccessLevel.PUBLIC;

@Target({FIELD, PARAMETER})

@Retention(SOURCE)

public @interface ObtainVia {

String field() default “”;

String method() default “”;

boolean isStatic() default false;

}

}

示例

@Builder

public class BuilderDemo {

private final String firstname;

private final String lastname;

private final String email;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class BuilderDemo {

private final String firstname;

private final String lastname;

private final String email;

BuilderDemo(String firstname, String lastname, String email) {

this.firstname = firstname;

this.lastname = lastname;

this.email = email;

}

public static BuilderDemo.BuilderDemoBuilder builder() {

return new BuilderDemo.BuilderDemoBuilder();

}

public static class BuilderDemoBuilder {

private String firstname;

private String lastname;

private String email;

BuilderDemoBuilder() {

}

public BuilderDemo.BuilderDemoBuilder firstname(String firstname) {

this.firstname = firstname;

return this;

}

public BuilderDemo.BuilderDemoBuilder lastname(String lastname) {

this.lastname = lastname;

return this;

}

public BuilderDemo.BuilderDemoBuilder email(String email) {

this.email = email;

return this;

}

public BuilderDemo build() {

return new BuilderDemo(this.firstname, this.lastname, this.email);

}

public String toString() {

return “BuilderDemo.BuilderDemoBuilder(firstname=” + this.firstname + “, lastname=” + this.lastname + “, email=” + this.email + “)”;

}

}

}

3.9 @SneakyThrows

@SneakyThrows 注解用于自動拋出已檢查的異常,而無需在方法中使用 throw 語句顯式拋出。@SneakyThrows 注解的定義如下:

@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})

@Retention(RetentionPolicy.SOURCE)

public @interface SneakyThrows {

// 設置你希望向上拋的異常類

Class《? extends Throwable》[] value() default java.lang.Throwable.class;

}

示例

public class SneakyThrowsDemo {

@SneakyThrows

@Override

protected Object clone() {

return super.clone();

}

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class SneakyThrowsDemo {

public SneakyThrowsDemo() {

}

protected Object clone() {

try {

return super.clone();

} catch (Throwable var2) {

throw var2;

}

}

}

3.10 @NonNull

你可以在方法或構造函數的參數上使用 @NonNull 注解,它將會為你自動生成非空校驗語句。@NonNull 注解的定義如下:

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE})

@Retention(RetentionPolicy.CLASS)

@Documented

public @interface NonNull {

}

示例

public class NonNullDemo {

@Getter

@Setter

@NonNull

private String name;

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class NonNullDemo {

@NonNull

private String name;

public NonNullDemo() {

}

@NonNull

public String getName() {

return this.name;

}

public void setName(@NonNull String name) {

if (name == null) {

throw new NullPointerException(“name is marked non-null but is null”);

} else {

this.name = name;

}

}

}

3.11 @Clean

@Clean 注解用于自動管理資源,用在局部變量之前,在當前變量范圍內即將執行完畢退出之前會自動清理資源,自動生成 try-finally 這樣的代碼來關閉流。

@Target(ElementType.LOCAL_VARIABLE)

@Retention(RetentionPolicy.SOURCE)

public @interface Cleanup {

// 設置用于執行資源清理/回收的方法名稱,對應方法不能包含任何參數,默認名稱為close。

String value() default “close”;

}

示例

public class CleanupDemo {

public static void main(String[] args) throws IOException {

@Cleanup InputStream in = new FileInputStream(args[0]);

@Cleanup OutputStream out = new FileOutputStream(args[1]);

byte[] b = new byte[10000];

while (true) {

int r = in.read(b);

if (r == -1) break;

out.write(b, 0, r);

}

}

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class CleanupDemo {

public CleanupDemo() {

}

public static void main(String[] args) throws IOException {

FileInputStream in = new FileInputStream(args[0]);

try {

FileOutputStream out = new FileOutputStream(args[1]);

try {

byte[] b = new byte[10000];

while(true) {

int r = in.read(b);

if (r == -1) {

return;

}

out.write(b, 0, r);

}

} finally {

if (Collections.singletonList(out).get(0) != null) {

out.close();

}

}

} finally {

if (Collections.singletonList(in).get(0) != null) {

in.close();

}

}

}

}

3.11 @With

在類的字段上應用 @With 注解之后,將會自動生成一個 withFieldName(newValue) 的方法,該方法會基于 newValue 調用相應構造函數,創建一個當前類對應的實例。@With 注解的定義如下:

@Target({ElementType.FIELD, ElementType.TYPE})

@Retention(RetentionPolicy.SOURCE)

public @interface With {

AccessLevel value() default AccessLevel.PUBLIC;

With.AnyAnnotation[] onMethod() default {};

With.AnyAnnotation[] onParam() default {};

@Deprecated

@Retention(RetentionPolicy.SOURCE)

@Target({})

public @interface AnyAnnotation {

}

}

示例

public class WithDemo {

@With(AccessLevel.PROTECTED)

@NonNull

private final String name;

@With

private final int age;

public WithDemo(String name, int age) {

if (name == null) throw new NullPointerException();

this.name = name;

this.age = age;

}

}

以上代碼經過 Lombok 編譯后,會生成如下代碼:

public class WithDemo {

@NonNull

private final String name;

private final int age;

public WithDemo(String name, int age) {

if (name == null) {

throw new NullPointerException();

} else {

this.name = name;

this.age = age;

}

}

protected WithDemo withName(@NonNull String name) {

if (name == null) {

throw new NullPointerException(“name is marked non-null but is null”);

} else {

return this.name == name ? this : new WithDemo(name, this.age);

}

}

public WithDemo withAge(int age) {

return this.age == age ? this : new WithDemo(this.name, age);

}

}

3.12 其它特性

val

val 用在局部變量前面,相當于將變量聲明為 final,此外 Lombok 在編譯時還會自動進行類型推斷。val 的使用示例:

public class ValExample {

public String example() {

val example = new ArrayList《String》();

example.add(“Hello, World!”);

val foo = example.get(0);

return foo.toLowerCase();

}

public void example2() {

val map = new HashMap《Integer, String》();

map.put(0, “zero”);

map.put(5, “five”);

for (val entry : map.entrySet()) {

System.out.printf(“%d: %s

”, entry.getKey(), entry.getValue());

}

}

}

以上代碼等價于:

public class ValExample {

public String example() {

final ArrayList《String》 example = new ArrayList《String》();

example.add(“Hello, World!”);

final String foo = example.get(0);

return foo.toLowerCase();

}

public void example2() {

final HashMap《Integer, String》 map = new HashMap《Integer, String》();

map.put(0, “zero”);

map.put(5, “five”);

for (final Map.Entry《Integer, String》 entry : map.entrySet()) {

System.out.printf(“%d: %s

”, entry.getKey(), entry.getValue());

}

}

}

至此功能強大的 Lombok 工具就介紹完畢了。

source:https://www.yuque.com/fengzheng-fly67/zln9pu/hgu2wb

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    3001

    瀏覽量

    116422
  • IDE
    IDE
    +關注

    關注

    0

    文章

    365

    瀏覽量

    49056
  • Code
    +關注

    關注

    0

    文章

    71

    瀏覽量

    16230
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73960

原文標題:Lombok 使用指南

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    TE Connectivity HDC HMN EMC模塊插件技術分析

    TE Connectivity (TE) HDC HMN EMC模塊插件設計用于在模塊化系統中提供EMC保護解決方案。HDC HMN EMC模塊插件使設計人員能夠在一個模塊化系統中整合信號和電源。該解決方案可節省空間、提高成本效益,并避免額外電源噪聲。
    的頭像 發表于 11-09 14:21 ?989次閱讀

    vscode的rtthread micropython插件沒有創建工程的圖標,為什么?

    我想用micropython開發ESP32,請問我的vscode已經安裝了RT-Thread micropython插件,為什么在下方沒有創建micropython的“+”圖標呢?
    發表于 09-28 13:13

    所見即所得——Luban-Lite VS Code插件開發實現“命令行自由”

    NEWS所見即所得!Luban-LiteVSCode插件指南親愛的開發者朋友們,你是否還在為嵌入式開發中頻繁切換命令行而抓狂?配置環境參數如“走迷宮”,編譯燒錄還需切換AiBurn?今天,匠芯創為您
    的頭像 發表于 08-07 15:38 ?1098次閱讀
    所見即所得——Luban-Lite VS Code<b class='flag-5'>插件</b>讓<b class='flag-5'>開發</b>實現“命令行自由”

    解鎖本地設備交互:機智云端插件接入Gokit5實戰指南(音量/亮度控制)

    插件使用說明機智云端插件目前支持Gokit5的按鍵亮度調節、播放音量調節,可用于自然語言控制設備。1、端插件是什么端插件是扣子插件的一種類
    的頭像 發表于 07-30 18:03 ?680次閱讀
    解鎖本地設備交互:機智云端<b class='flag-5'>插件</b>接入Gokit5實戰指南(音量/亮度控制)

    KiCad-Parasitics:KiCad 寄生參數分析插件

    “ ? 這是一款用于分析 PCB 編輯器中走線(wires)寄生參數的插件。 ? ” ? ? 要使用該插件,您必須在電路板上標記兩個點。通常情況下,最好是選擇由同一根走線連接的兩個焊盤。標記后,該
    的頭像 發表于 06-25 11:14 ?2050次閱讀
    KiCad-Parasitics:KiCad 寄生參數分析<b class='flag-5'>插件</b>

    必看!PCBA插件DIP加工的注意事項,少走彎路!

    一站式PCBA加工廠家今天為大家講講什么是PCBA插件DIP加工?PCBA插件DIP加工步驟及注意事項。在現代電子產品的制造過程中,PCBA是核心環節之一。而PCBA插件DIP加工,作為一種傳統
    的頭像 發表于 06-23 09:47 ?1149次閱讀

    用 VSCode 編寫自己的 KiCad 插件(下)

    “ ?很多小伙伴都想自己開發 KiCad 插件,但不知從何入手。本文由華秋電子的另一位 KiCad 開發者波波同學撰寫,分享了如何快速搭建環境,并開發一個簡單的
    的頭像 發表于 06-19 11:44 ?2859次閱讀
    用 VSCode 編寫自己的 KiCad <b class='flag-5'>插件</b>(下)

    PCBA插件DIP加工揭秘:從概念到流程全解析!

    一站式PCBA加工廠家今天為大家講講什么是PCBADIP插件加工?PCBA插件DIP加工注意事項。在現代電子產品的制造過程中,PCBA是核心環節之一。而PCBA插件DIP加工,作為一種傳統的元器件
    的頭像 發表于 06-19 09:12 ?1194次閱讀

    用VSCode編寫自己的KiCad插件(上)詳細步驟教程

    “ ?很多小伙伴都想自己開發 KiCad 插件,但不知從何入手。本文由華秋電子的另一位 KiCad 開發者波波同學撰寫,分享了如何快速搭建環境,并開發一個簡單的
    的頭像 發表于 06-17 11:10 ?3081次閱讀
    用VSCode編寫自己的KiCad<b class='flag-5'>插件</b>(上)詳細步驟教程

    使用DevEcoStudio 開發、編譯鴻蒙 NEXT_APP 以及使用中文插件

    # 使用DevEcoStudio 開發、編譯鴻蒙 NEXT_APP 以及使用中文插件 #鴻蒙開發工具 #DevEco Studio ## 1. 概述 DevEco Studio 是華為提供
    發表于 06-11 17:18

    [迅為]Linux開發小技巧:Remote - SSH插件

    [迅為]Linux開發小技巧:Remote - SSH插件
    的頭像 發表于 04-01 15:46 ?1161次閱讀
    [迅為]Linux<b class='flag-5'>開發</b>小技巧:Remote - SSH<b class='flag-5'>插件</b>

    納雷科技推出Milestone VMS插件

    為解決安防雷達集成開發難、主流平臺不適配等問題,納雷開發Milestone VMS平臺插件,與Milestone XProtect大型、中小型、精簡版系列產品無縫對接,可助力客戶一鍵完成平臺部署。
    的頭像 發表于 03-21 11:41 ?1264次閱讀

    edge瀏覽器識別 latex語法插件

    默認的瀏覽器是沒有latex識別功能的,容易顯示為亂碼或者源碼,無法正常識別。本插件需要在瀏覽器的擴展程序菜單下安裝,能在edge下完美運行。本插件是免費插件
    發表于 03-17 18:03 ?1次下載

    PREEvision插件使用場景介紹

    PREEvision插件中心(Add-in House)是Vector中國PREEvision團隊針對中國用戶開發插件網站。用戶可以在這里找到各種場景的擴展插件,包括以太網與SOA設
    的頭像 發表于 03-14 13:50 ?1240次閱讀
    PREEvision<b class='flag-5'>插件</b>使用場景介紹

    FakeQuantize不支持VPU插件嗎?

    “FakeQuantize”層不受 VPU 插件支持。
    發表于 03-06 07:01