为什么我不能使用类的实例来调用Java类的公共方法?

时间:2019-11-01 17:33:51

标签: java android

有问题的方法和类是BluetoothGattCharacteristic类的setInstanceId方法。 该方法声明为:

    public void setInstanceId(int instanceId) {
        mInstance = instanceId;
    }

出于超出此问题范围但可以解释的原因,here,我正在尝试制作BluetoothGattCharacteristic对象的副本。我正在使用以下代码创建新实例:

mTxCharacteristic2 = new BluetoothGattCharacteristic(mTxCharacteristic.getUuid(),mTxCharacteristic.getProperties(), mTxCharacteristic.getPermissions());

因此,基本上,我有一个称为mTxCharacteristic的特征实例,我想复制一个mTxCharacteristic2。然后,我要打以下电话:

mTxCharacteristic2.setInstanceId(mTxCharacteristic.getInstanceId());

这将导致编译错误“错误:找不到符号方法setInstanceId(int)”。

我不了解的部分是setInstanceId被声明为该类的公共对象。那我为什么不能打电话呢?

我也试图用反射来称呼它。但是,当我打电话时:

Method setInstanceIdMethod = BluetoothGattCharacteristic.class.getDeclaredMethod("setInstanceId", int.class);

调用此方法将引发NoSuchMethodException异常。即使问题是由于SDK 24 vs. SDK 28问题造成的,我在运行时遇到异常的电话仍在运行Android9。

一个可能的解释是,可能是Android Studio实际上使用的是BluetoothGattCharacteristic类的某些旧版本,而不是在右键单击该类名称时打开的BluetoothGattCharacteristic.java类中显示的版本。我的build.gradle文件中将minSdkVersion设置为24,将targetSdkVersion设置为28。当我为BluetoothGattCharacteristic.java文件选择“在Finder中显示”时,它将在以下路径显示: 〜/ Library / Android / sdk / sources / android-28 / android / bluetooth / BluetoothGattCharacteristic.java

或者也许有某种方法可以在SDK 24中声明此方法不可用?无论哪种方式,我显然都不明白它在做什么。我对Java有点陌生,并且具有C ++背景。

1 个答案:

答案 0 :(得分:3)

根据BluetoothGattCharacteristic documentationsetInstanceId()不属于公共API。

按照source code

/**
 * Force the instance ID.
 *
 * @hide
 */
public void setInstanceId(int instanceId) {
    mInstance = instanceId;
}

此方法被标记为@hide,因此是公开Android SDK的 not 部分,并且不保证任何单独设备上都存在该兼容性(制造商可以删除,重命名,或以其他方式更改不属于公共API表面的API。