Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@Hide in注释隐藏方法/类_Java_Android_Annotations_Documentation_Hide - Fatal编程技术网

Java 使用@Hide in注释隐藏方法/类

Java 使用@Hide in注释隐藏方法/类,java,android,annotations,documentation,hide,Java,Android,Annotations,Documentation,Hide,我正在为android开发一个库(jar),我希望我的类或方法只能在库内访问,而不能在库外访问。不使用修饰符将使类在该包中可访问,但我的情况是,如果没有public修饰符,该类将无法使用,因为不使用修饰符将使它在我不想要的其他包中不可访问。例如 我有一个班级说 public class Globals { public static String thisDeviceAddress; public static String thisDeviceIP; public s

我正在为android开发一个库(jar),我希望我的类或方法只能在库内访问,而不能在库外访问。不使用修饰符将使类在该包中可访问,但我的情况是,如果没有
public
修饰符,该类将无法使用,因为不使用修饰符将使它在我不想要的其他包中不可访问。例如 我有一个班级说

public class Globals {

    public static String thisDeviceAddress;
    public static String thisDeviceIP;
    public static String thisDeviceName = "";

}
这个班到处都可以上。问题是,我希望它可以在我正在开发的库中访问,但不能在库外访问。我知道使用注解
@hide
可以解决这个问题。例如:

/**
 * @hide
 */
class Globals {

    public static String thisDeviceAddress;
    public static String thisDeviceIP;
    public static String thisDeviceName = "";
}

我在谷歌上搜索了很多,但找不到实现
@hide
的方法。仅在没有库的情况下使用
@hide
并不能隐藏该类。所以,请给我适当的指导。有图书馆要用吗?有办法解决这个问题吗?

没有办法隐藏公共类和方法。这是Java语言规范,您不能破坏它。

要使其正常工作,您需要更改您的分发模型,以包括两个JAR:

  • 一个“仅编译时”的API jar,它只为您的库提供公共/非隐藏的“存根”
  • 一个“运行时实现”jar,包含库所需的所有代码(构建库时默认获得的当前aar/jar)
  • 要使用
    @hide
    并生成API存根,必须使用
    Doclava
    (一个实现
    @hide
    并具有生成存根选项的自定义
    javadoc
    Doclet)

    您可以通过以下步骤生成API存根jar:

  • 从谷歌获得定制的
    Doclava
    doclet,您可以从中克隆并构建自己,也可以下载预构建的jar-fom

  • 将Doclava jar放在库根目录下的一个目录中(靠近
    src
    目录),例如
    /path/to/project/mylib/Doclava/Doclava.jar

  • 更改您的
    build.gradle
    ,如下所示:

  • 像往常一样构建项目。API存根jar文件将出现在
    /path/to/project/mylib/build/API/API.jar
    下。您可以像往常一样分发和使用这个
    api.jar
    文件作为
    compileOnly
    依赖项

  • 。。。不要忘记在部署时使用/打包库的实际实现jar/aar

    @hide
    不起作用-它只是在构建SDK时从存根android.jar中删除一个符号,因此无法编写代码直接访问它们。这些符号将在运行时出现,并且可以通过反射进行访问。但这并不能解决你的问题。谢谢你的回复。如果通过反射访问类/方法,我没有问题。但我不希望它直接可见。如果有效,请告诉我使用@hide需要设置什么。@Dipendra,我这里也有同样的情况。你找到解决办法了吗?
    dependencies {
        ...
        ...
    
        // Make implementation and compileOnly classes accessible to other tasks.
        configurations.getAt("implementation").setCanBeResolved(true)
        configurations.getAt("compileOnly").setCanBeResolved(true)
    }
    
    // A gradle task to generate the stubs using Doclava.
    task generateStubSources(type: Javadoc) {
        source = [file('src/main/java')]
        outputs.dir "$buildDir/api/stub-sources" 
        title = null
    
        options {
            bootClasspath = project.files(
                    project.android.getBootClasspath(),
                    configurations.implementation,
                    configurations.compileOnly
            ).getFiles().asList()
    
            doclet = 'com.google.doclava.Doclava'
            docletpath = fileTree(dir: 'doclava', include: '**/*.jar').asType(List)
            addFileOption 'stubs', file("$buildDir/api/stub-sources")
            addBooleanOption 'hide 111', true
            addBooleanOption 'hide 113', true
            addBooleanOption 'keepstubcomments', true
            addBooleanOption 'stubsourceonly', true
            addBooleanOption 'nodocs', true
            addBooleanOption 'android', true
    
            noTimestamp false
            jFlags '-Dignore.symbol.file'
        }
    }
    
    // A task to compile the stubs.
    task compileStubs(type: JavaCompile, dependsOn: 'generateStubSources') {
        source = fileTree("$buildDir/api/stub-sources")
        destinationDir = file("$buildDir/api/stub-classes")
        classpath = files(source, generateStubSources.options.bootClasspath)
    }
    
    // A task to jar the compiled stubs.
    task jarStubs(type: Jar) {
        from compileStubs
        destinationDirectory = file("$buildDir/api")
        archiveBaseName = 'api'
    }
    
    // The full task to generate the API stubs jar.
    task generateAndJarStubs(dependsOn: ['generateStubSources', 'jarStubs'])
    
    afterEvaluate {
        // Generate and jar the stubs after building the actual project.
        compileReleaseSources.finalizedBy(generateAndJarStubs)
        compileDebugSources.finalizedBy(generateAndJarStubs)
    }