Java 使用@Hide in注释隐藏方法/类
我正在为android开发一个库(jar),我希望我的类或方法只能在库内访问,而不能在库外访问。不使用修饰符将使类在该包中可访问,但我的情况是,如果没有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
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:
@hide
并生成API存根,必须使用Doclava
(一个实现@hide
并具有生成存根选项的自定义javadoc
Doclet)
您可以通过以下步骤生成API存根jar:
Doclava
doclet,您可以从中克隆并构建自己,也可以下载预构建的jar-fom
src
目录),例如/path/to/project/mylib/Doclava/Doclava.jar
build.gradle
,如下所示:
/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)
}