0

我正在开发一个 Java 11 项目,

这是我的 build.gradle:

plugins {
    id 'java'
}
//

sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

repositories {
    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
}

dependencies {
    implementation 'org.projectlombok:lombok:1.18.18'
    implementation "io.vavr:vavr:0.10.3"
    compileOnly 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
    implementation 'systems.manifold:manifold-science:2021.1.25-SNAPSHOT'

    testCompileOnly 'org.projectlombok:lombok:1.18.20'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
    testAnnotationProcessor 'org.openjdk.jmh:jmh-generator-annprocess'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine'
}

test {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
}

My Manifold 的扩展方法:

import manifold.ext.rt.api.Extension;
import manifold.ext.rt.api.This;

@Extension
public class MyStringEx {

    public static void echo(@This String thiz) {
        System.out.println(thiz);
    }
}

它编译成功。但是现在,我想通过 Manifold 扩展注释向java.lang.String类添加一个方法,我试过这个:

public class Main {
    public static void main(String[] args) {
        "hello".echo(); // Add your own methods to String!
    }
}

但我得到错误:

java: cannot find symbol
  symbol:   method echo()
  location: class java.lang.String
4

2 回答 2

0

首先,您可以尝试上面提到的答案。但是,如果您使用的是 IntelliJ IDEA,那么更简单的解决方案可能是:

Ctrl+Alt+S 打开 IDE 设置 -> 插件 -> 搜索 mainfold -> 安装它 -> 创建一个新的扩展类 -> 键入您要扩展的类 -> 创建并在其中完成工作。

于 2021-10-09T18:33:07.700 回答
0

有关流形科学,请参阅Gradle 设置文档。您的依赖项应该是:

implementation 'systems.manifold:manifold-science:2021.1.25'
annotationProcessor 'systems.manifold:manifold-ext:2021.1.25'

您还需要为 Manifold 添加编译器参数:

if (JavaVersion.current() != JavaVersion.VERSION_1_8 &&
    sourceSets.main.allJava.files.any {it.name == "module-info.java"}) {
    tasks.withType(JavaCompile) {
        // if you DO define a module-info.java file:
        options.compilerArgs += ['-Xplugin:Manifold', '--module-path', it.classpath.asPath]
    }
} else {
    tasks.withType(JavaCompile) {
        // If you DO NOT define a module-info.java file:
        options.compilerArgs += ['-Xplugin:Manifold']
    }
}

此外,您的扩展类的包必须遵循此处记录的约定。基本上,类的限定名称附加到“扩展”包上。如果您使用的是 Java 模块,则应使用模块名称来限定包。例如,

package mymodule.extensions.java.lang.String;
于 2021-10-10T01:56:14.463 回答