我最近将j2objc从0.9.4更新到最新版本(0.9.8.2.1)。以前的版本会将所有成员生成为公共成员,但默认情况下会隐藏0.9.6私有成员。出于某些原因,我必须能够访问其他类的一些私人成员。 release notes中有一个解决方案:
注意:--hide-private-members现在是默认的,因此私有字段 并且公共头文件中不再显示方法。如果说 打破你的项目,修复非法引用,制作那些 成员非私人(因为他们不是),或使用 --no-hide-private-members flag。
我试图将此标志附加到我的项目中,但没有成功(我无法更改java代码)。我试过阅读j2objc --help
,但没有提到这个标志。所以我想知道我在哪里设置这个标志,以便像以前那样与所有公共成员一起构建项目?
我使用与描述here (in documentation)类似的makefile。这是它的一部分:
default: translate cycle_finder
clean:
@rm -rf $(BUILD_DIR)
@rm -rf $(J2OBJC_RESULT_DIR)
@rm -f $(RETAIN_CYCLES)
$(BUILD_DIR)/%.o: $(BUILD_DIR)/%.m
$(J2OBJCC) -I$(BUILD_DIR) -c $? -o $@
translate: pre_translate $(J2OBJC_GENERATED_SOURCES)
@if [ `cat $(JAVA_SOURCES) | wc -l` -ge 1 ] ; then \
./build_mappings.pl $(CALCULATOR_NEUTRAL_DIR) CN > $(JAVA_PACKAGE_MAPPINGS); \
./build_mappings.pl $(FOUNDATION_NEUTRAL_DIR) FN >> $(JAVA_PACKAGE_MAPPINGS); \
./build_mappings.pl $(CALCULATOR_NEUTRAL_TEST_DIR) CNT >> $(JAVA_PACKAGE_MAPPINGS); \
./build_mappings.pl $(FOUNDATION_NEUTRAL_TEST_DIR) FNT >> $(JAVA_PACKAGE_MAPPINGS); \
$(J2OBJC) \
--no-hide-private-members \
-sourcepath $(SOURCE_DIR) \
$(ADDITIONAL_CLASS_PATHS) -use-arc \
-d $(J2OBJC_RESULT_DIR) \
--prefixes $(JAVA_PACKAGE_MAPPINGS) \
`cat $(JAVA_SOURCES)` ; \
fi
cycle_finder: pre_translate $(J2OBJC_GENERATED_SOURCES)
-@if [ `cat $(JAVA_SOURCES) | wc -l` -ge 1 ] ; then \
$(CYCLE_FINDER) \
--no-hide-private-members \
-sourcepath $(SOURCE_DIR) \
-w $(WHITELIST_PATH) \
$(ADDITIONAL_CLASS_PATHS) \
`cat $(JAVA_SOURCES)` > $(RETAIN_CYCLES); \
fi
$(J2OBJC_RESULT_DIR):
@mkdir -p $(J2OBJC_RESULT_DIR)
$(BUILD_DIR):
@mkdir -p $(BUILD_DIR)
pre_translate: $(J2OBJC_RESULT_DIR) $(BUILD_DIR)
@rm -f $(JAVA_SOURCES)
@touch $(JAVA_SOURCES)
$(J2OBJC_RESULT_DIR)/%.m $(J2OBJC_RESULT_DIR)/%.h: $(SOURCE_DIR)/%.java JavaBuild.make
@echo $< >> $(JAVA_SOURCES)
感谢您的任何帮助和建议。
答案 0 :(得分:0)
--no-hide-private-members
标志只是一个临时的标志,可以给项目一些时间来更新他们的访问,并且在两年前发布了0.9.4。该标志用于允许构建仍然有效,但现在被忽略。
通常,私有字段不应该被外部类访问,无论它们写入什么语言。首先,我们天真地假设本机开发人员会遵守已翻译代码中声明的访问,但我们发现Xcode&# 39;使用私有成员制作的代码完成太诱人了。现在私有字段,方法和类现在都隐藏在.m文件中。
那就是说,没有什么可以阻止你解决访问限制。要在Java中实现这一点(也应该适用于Android):
Field f = TargetClass.class.getDeclaredField("privateField");
f.setAccessible(true);
// read or write f using reflection
要本机执行此操作,您可以尝试将目标类生成的.m文件(声明字段)中的类类别复制到本机文件中。 AFAIK,只要它们没有区别,就不会阻止多个.m文件添加相同的类别类别。但是,我还没有验证这项工作,因为私人领域不应该由外部类访问!&#34; : - )
答案 1 :(得分:0)
问题是j2objc生成了无效的Objective-C代码。所有私人ivars不能属于一个类别,你最终会
error: instance variables may not be placed in class extension
您拥有的每个私有java变量。
有时代码是第三方,我们无法更新访问权限。