Pyjnius: 1.2.1μ—μ„œ μ•‘μ„ΈμŠ€ν•  수 μ—†λŠ” 슈퍼클래슀 λ©”μ„œλ“œ

에 λ§Œλ“  2019λ…„ 12μ›” 13일  Β·  20μ½”λ©˜νŠΈ  Β·  좜처: kivy/pyjnius

arraylist = autoclass("java.util.ArrayList")()
arraylist.iterator()
arraylist.stream()

이것은 1.2.0μ—μ„œλŠ” μž‘λ™ν•˜μ§€λ§Œ 1.2.1μ—μ„œλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

AttributeError                            Traceback (most recent call last)
<ipython-input-7-5e67e1c90388> in <module>()
----> 1 arraylist.stream()

AttributeError: 'java.util.ArrayList' object has no attribute 'stream'

https://colab.research.google.com/drive/1F9u2jVQR5JFw_mk5Bq--VH1Ki91Xe5x3 μ—μ„œ μž¬ν˜„ κ°€λŠ₯ν•œ λ…ΈνŠΈλΆ

stream()은 수퍼 μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κΈ°λ³Έκ°’μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€.

λ˜ν•œ java.util.Listλ₯Ό ν™•μž₯ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œμ— μ•‘μ„ΈμŠ€ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ™μΌν•œ 문제λ₯Ό κ΄€μ°°ν–ˆλŠ”λ° 슈퍼클래슀 λ©”μ„œλ“œλŠ” 1.2.1μ—μ„œ μ•‘μ„ΈμŠ€ν•  수 μ—†μ§€λ§Œ λͺ¨λ“  것이 1.2.0μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. 이것은 맀우 λΆˆμΎŒν•œ λ²„κ·Έμž…λ‹ˆλ‹€. 1.2.1 릴리슀λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ μ‚¬μš©ν•  수 μ—†λŠ” κ²ƒμœΌλ‘œ ν‘œμ‹œν•˜λŠ” 것이 합리적이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  20 λŒ“κΈ€

λ‘œμ»¬μ—μ„œ μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. CIμ—μ„œλ„ λ°œμƒν•˜λŠ”μ§€ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€. μ‹œκ°„μ΄ λ‚˜λ©΄ μˆ˜μ • 사항을 μ°Ύμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

CIκ°€ μ‹€νŒ¨ν–ˆμ§€λ§Œ 1.2.1μ—μ„œ μ–΄λ–»κ²Œ κΉ¨μ‘ŒλŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. getDeclaredMethods()에 κΈ°λ³Έ κ΅¬ν˜„μΈ λ©”μ„œλ“œκ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. (클래슀 λ˜λŠ” ν•΄λ‹Ή μƒμœ„ μœ ν˜•μ—μ„œ μ„ μ–Έλ˜μ§€ μ•ŠμŒ).

https://blog.jooq.org/2018/03/28/correct-reflective-access-to-interface-default-methods-in-java-8-9-10/에 μ•½κ°„μ˜ 토둠이 μžˆμŠ΅λ‹ˆλ‹€. 관련이 μžˆμŠ΅λ‹ˆλ‹€.

μ†”λ£¨μ…˜μ€ λ˜ν•œ κΈ°λ³Έ λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€μ™€ μƒμœ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ±·λŠ” κ²ƒμž…λ‹ˆκΉŒ? (좔상 λ©”μ†Œλ“œλ₯Ό μΆ”κ°€ν•  수 μžˆμ§€λ§Œ ꡬ체 객체에 μ˜ν•΄ κ΅¬ν˜„λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ 이것은 λΆˆν•„μš”ν•œ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.)

이것은 λ‚΄κ°€ 찾은 κ°€μž₯ 관련성이 유래 μŠ€λ ˆλ“œμž…λ‹ˆλ‹€ : https://stackoverflow.com/questions/28400408/what-is-the-new-way-of-getting-all-methods-of-a-class-including-inherited- 데포

λ‹€λ₯Έ JVM κ΅¬ν˜„μ— μ•½κ°„μ˜ 차이가 μžˆμ„ 수 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€...

λ¨Όμ € java.util.Collection으둜 μΊμŠ€νŠΈν•˜λ©΄ μž‘λ™ν•˜μ§€λ§Œ ν•„μš”ν•˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€... :/

λ‚˜λŠ” λ˜ν•œ getMethods λŒ€μ‹  getDeclaredMethodsλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€. λͺ¨λ“  μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚΄νŽ΄λ³΄λ €κ³  ν–ˆμ§€λ§Œ μ–΄μ¨Œλ“  getInterfaces()μ—μ„œ Collection μΈν„°νŽ˜μ΄μŠ€λ₯Ό 찾지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€β€¦

흠, 이것은 νš¨κ³Όκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€... 이유λ₯Ό μ™„μ „νžˆ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.
https://github.com/kivy/pyjnius/pull/466/files#diff -06f2b31838f083623d82353f734d644a

νŽΈμ§‘: μ–΄, segfaultλ₯Ό μœ„ν•΄ μ €μž₯… https://github.com/kivy/pyjnius/runs/348651345
결함인 경우λ₯Ό λŒ€λΉ„ν•˜μ—¬ λ‹€μ‹œ 싀행을 μ‹œλ„ν•˜κ³  μš°λΆ„νˆ¬, python3.8, Java 10μ—μ„œ λ‹€μ‹œ μΆ©λŒν–ˆμŠ΅λ‹ˆλ‹€β€¦
edit2: 맀우 ν˜Όλž€μŠ€λŸ½μŠ΅λ‹ˆλ‹€. 3.8/java10/ubuntuλ₯Ό ν•¨κ»˜ μ œμ™Έν–ˆμ„ λ•Œ λͺ¨λ“  ν˜„μž¬ 쑰합이 μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ Java 9 및 11을 ν™œμ„±ν™”ν•˜κ³  3.7/11/ubuntu와 λ™μΌν•œ 좩돌이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€... 적어도 μ €λŠ” openjdk-11-jdkλ₯Ό μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ μš°λΆ„νˆ¬μ—μ„œ python3.7둜 μ‰½κ²Œ ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€... ...그리고 μž‘λ™ν•©λ‹ˆλ‹€. grmbl.

https://dev.azure.com/conda-forge/feedstock-builds/_build/results?buildId=100815&view=logs&j=696704cc-6fef-57a3-ea36-f27779b8cd5e&t=06421391-4b55-52
λΆ€μˆ˜μ μœΌλ‘œ Linux의 conda-forge λΉŒλ“œμ—λ„ 1.2.1에 일뢀 segfaultκ°€ μžˆλŠ” 것 κ°™μœΌλ―€λ‘œ λ¬Έμ œκ°€ λ³€κ²½λ˜κΈ° 전에 μžˆμ—ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ½œλΌλ³΄λ ˆμ΄μ…˜μ—μ„œ νŒ¨μΉ˜κ°€ μž‘λ™ν•©λ‹ˆλ‹€.

κ³΅μ†ν•œ λ²”ν”„. 이거 ν•˜λ‚˜λ‘œ ν•©μΉ˜λ©΄ 쒋을텐데. μ½”λ“œ 주석을 μ œμ•ˆν•˜λŠ” diff에 주석을 μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

이 글을 λ‚¨κΈ°κ²Œ ν•΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. CIκ°€ ν†΅κ³Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” 것이 무엇인지 μ „ν˜€ λͺ¨λ¦…λ‹ˆλ‹€. 이해할 수 μ—†λŠ” 였λ₯˜λ₯Ό μ—†μ• κΈ° μœ„ν•΄ λŒ€μƒμ˜ 일뢀λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” 것을 정말 μ’‹μ•„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 λΉ„νŠΈλ‘œνŠΈκ°€ 더 쒋지 μ•Šλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. m 이것을 μ–΄λ–»κ²Œ 진행해야 할지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

이것이 #480에 λ”°λ₯Έ λ™μ‹œμ„± λ¬Έμ œμΈμ§€ κΆκΈˆν–ˆμ§€λ§Œ pytestλŠ” 기본적으둜 λ™μ‹œμ„±μ΄λΌκ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ‘œμ»¬μ—μ„œ μž¬μƒμ„ μ‹œλ„ν–ˆμ§€λ§Œ #480 μž¬μƒμ— μ„±κ³΅ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ λͺ…령은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. Debian 기반 μ΄λ―Έμ§€μž…λ‹ˆλ‹€.

docker run -i continuumio/anaconda3 /bin/bash <<EOF

cat /etc/os-release
apt-get update
mkdir /usr/share/man/man1
apt-get -y install openjdk-11-jdk-headless gcc ant

conda create -y -n pyjnius python=3.7.5
conda activate pyjnius

git clone https://github.com/kivy/pyjnius.git
cd pyjnius/
python -m pip install -U setuptools cython
python setup.py bdist_wheel
pip install --timeout=120 .[dev,ci]
ant all
cd tests/
CLASSPATH="../build/test-classes:../build/classes" PYTHONPATH=/opt/conda/envs/pyjnius/lib/python3.7/site-packages/ pytest -v
cd ../
git checkout -b issue_465 origin/issue_465

python setup.py bdist_wheel
pip install --timeout=120 .[dev,ci]
ant all
cd tests/
CLASSPATH="../build/test-classes:../build/classes" PYTHONPATH=/opt/conda/envs/pyjnius/lib/python3.7/site-packages/ pytest -v

EOF

λͺ¨λ“  ν…ŒμŠ€νŠΈλŠ” λ§ˆμŠ€ν„°μ™€ λΈŒλžœμΉ˜μ—μ„œ ν†΅κ³Όλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ™μΌν•œ 문제λ₯Ό κ΄€μ°°ν–ˆλŠ”λ° 슈퍼클래슀 λ©”μ„œλ“œλŠ” 1.2.1μ—μ„œ μ•‘μ„ΈμŠ€ν•  수 μ—†μ§€λ§Œ λͺ¨λ“  것이 1.2.0μ—μ„œ μž‘λ™ν•©λ‹ˆλ‹€. 이것은 맀우 λΆˆμΎŒν•œ λ²„κ·Έμž…λ‹ˆλ‹€. 1.2.1 릴리슀λ₯Ό μ œκ±°ν•˜κ±°λ‚˜ μ‚¬μš©ν•  수 μ—†λŠ” κ²ƒμœΌλ‘œ ν‘œμ‹œν•˜λŠ” 것이 합리적이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

이 글을 λ‚¨κΈ°κ²Œ ν•΄μ„œ μ£„μ†‘ν•©λ‹ˆλ‹€. CIκ°€ ν†΅κ³Όν•˜μ§€ λͺ»ν•˜κ²Œ ν•˜λŠ” 것이 무엇인지 μ „ν˜€ λͺ¨λ¦…λ‹ˆλ‹€. 이해할 수 μ—†λŠ” 였λ₯˜λ₯Ό μ—†μ• κΈ° μœ„ν•΄ λŒ€μƒμ˜ 일뢀λ₯Ό λΉ„ν™œμ„±ν™”ν•˜λŠ” 것을 정말 μ’‹μ•„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 λΉ„νŠΈλ‘œνŠΈκ°€ 더 쒋지 μ•Šλ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. m 이것을 μ–΄λ–»κ²Œ 진행해야 할지 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

CI ν…ŒμŠ€νŠΈλ₯Ό λ‹€μ‹œ μ‹€ν–‰ν•˜λ„λ‘ μ œμ•ˆν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 이 문제λ₯Ό 쒁힐 수 μžˆμŠ΅λ‹ˆκΉŒ? 이 패치의 λ¬Έμ œμž…λ‹ˆκΉŒ, μ•„λ‹ˆλ©΄ 이전 λ²„μ „μ˜ λ¬Έμ œμž…λ‹ˆκΉŒ?

μ—¬κΈ°λ‘œ λŒμ•„κ°€λ €λ©΄:

getDeclaredMethods() 와 getMethods() μ„žλŠ” 것이 닡이라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. getMethods() 이면 μΆ©λΆ„ν•©λ‹ˆλ‹€.

이에 λŒ€ν•œ λ‚΄ ν…ŒμŠ€νŠΈ μ‚¬λ‘€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 def test_super_interface(self):
        LinkedList = autoclass('java.util.LinkedList')
        words = LinkedList()
        words.add('hello')
        words.add('world')
        q = cast('java.util.Queue', words)
        self.assertEqual(2, q.size())
        self.assertIsNotNone(q.iterator())

    def test_super_object(self):
        LinkedList = autoclass('java.util.LinkedList')
        words = LinkedList()
        words.hashCode()

    def test_super_interface_object(self):
        LinkedList = autoclass('java.util.LinkedList')
        words = LinkedList()
        q = cast('java.util.Queue', words)
        q.hashCode()

getDeclaredMethods()만 μ‚¬μš©ν•˜λ©΄ λ‹€μ–‘ν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

getMethods() λ‚˜μ˜ μœ μΌν•œ λ¬Έμ œλŠ” test_inheritance.py κ°€ μ‹€νŒ¨ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 μ•½κ°„μ˜ 문제만 μžˆμŠ΅λ‹ˆλ‹€. org.jnius.Child의 정적 newInstance() λŠ” org.jnius.Parent newInstance() λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•©λ‹ˆλ‹€. getMethods() λŠ” newInstance() λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ 보고 JavaMultipleMethodλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이것은 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€. Child.newInstance() λŠ” Parent.newInstance() μˆ¨κ²¨μ•Ό ν•©λ‹ˆλ‹€. https://www.java67.com/2012/08/can-we-override-static-method-in-java.html을 μ°Έμ‘°

jshell> org.jnius.Child.newInstance()
$3 ==> org.jnius.Child<strong i="24">@506c589e</strong>

μ•ˆλ…•ν•˜μ„Έμš” @tshirtman getMethods()λ₯Ό μ»€λ°‹ν–ˆμŠ΅λ‹ˆλ‹€. μœ„μ˜ μΆ”κ°€ ν…ŒμŠ€νŠΈ 사둀도 μΆ”μ²œν•©λ‹ˆλ‹€.
Child.newInstance()κ°€ Parent.newInstance()λ₯Ό μˆ¨κ²¨μ•Ό ν•œλ‹€λŠ” 것을 μˆ¨κΈ°λŠ” 정적 λ©”μ„œλ“œλ₯Ό ν•΄κ²°ν•˜λŠ” 방법을 ν™•μ‹ ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. autoclass()μ—μ„œ 클래슀 및 μΈν„°νŽ˜μ΄μŠ€μ˜ λ°˜λ³΅μ„ μž¬μ •λ ¬ν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 트리λ₯Ό νƒμƒ‰ν•˜μ—¬ 클래슀λ₯Ό κ°€μ Έμ˜¨ λ‹€μŒ java.lang.Objectμ—μ„œ μ‹œμž‘ν•˜μ—¬ μ—­μˆœμœΌλ‘œ μ μš©ν•©λ‹ˆλ‹€.

흠, μ‹€μ œλ‘œ 이 ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜λ©΄ ν˜„μž¬ java.util.Queue autoclass둜 μΊμŠ€νŒ…λœ 객체에 size 속성이 μ—†λ‹€λŠ” 것을 λ³΄μ—¬μ€λ‹ˆλ‹€. μ΄λŠ” 잘λͺ»λœ κ²ƒμž…λ‹ˆλ‹€.
λ‚˜λŠ” λ‹Ήμ‹ μ˜ 뢄석, μ—­ 쑰회, JavaMultipleMethodλ₯Ό λ§Œλ“œλŠ” λŒ€μ‹  λ™μΌν•œ μ„œλͺ…μœΌλ‘œ μƒμœ„ λ©”μ†Œλ“œλ₯Ό λŒ€μ²΄ν•˜λŠ” 것에 λ™μ˜ν•©λ‹ˆλ‹€. μ΄λŠ” 쒋은 μ „λž΅μΈ 것 κ°™μŠ΅λ‹ˆλ‹€.

501은 λͺ¨λ“  ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν–ˆμŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό λ‹«μŠ΅λ‹ˆλ‹€. (μ°¬μ–‘ν•˜λΌ).

보호 ν•„λ“œκ°€ 아직 μ—†μŠ΅λ‹ˆλ‹€!

이 쀄 을 public μ—μ„œ protected ν•˜λ©΄ ν…ŒμŠ€νŠΈμ— μ‹€νŒ¨ν•©λ‹ˆλ‹€.

λΉ„κ³΅κ°œ/보호된 λ©”μ„œλ“œ/ν•„λ“œλ₯Ό μ „ν˜€ λ…ΈμΆœν•΄μ•Ό ν•˜λŠ”μ§€ 여뢀에 λŒ€ν•΄ #500에 λŒ€ν•œ 토둠이 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 그것이 λ‹€λ₯΄λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν˜„μž¬ μš°λ¦¬λŠ” λͺ¨λ“  것을 가지고 μžˆμ–΄μ•Ό ν•˜λ©°, μˆ˜μ •μ„ 톡해 λ©”μ„œλ“œμ— λŒ€ν•΄ 사싀인 것 κ°™μ§€λ§Œ λΆ„λͺ…νžˆ ν•„λ“œμ— λŒ€ν•΄μ„œλŠ” 사싀이 μ•„λ‹ˆλ―€λ‘œ(그리고 μ•„λ§ˆλ„ κ²°μ½” 그렇지 μ•Šμ•˜μŠ΅λ‹ˆκΉŒ?) λ¨Όμ € ν•΄κ²°ν•΄μ•Ό ν•  버그라고 μƒκ°ν•©λ‹ˆλ‹€. , 그런 λ‹€μŒ 개인 정보 보호 μˆ˜μ€€μ— 따라 보고 싢은 λ©”μ„œλ“œ/ν•„λ“œ 필터링을 ν—ˆμš©ν• μ§€ μ—¬λΆ€. 이 버그가 μ’…λ£Œλ˜μ—ˆμœΌλ―€λ‘œ ν•΄λ‹Ή 사둀에 λŒ€ν•΄ μƒˆ 버그λ₯Ό μ—¬λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ©”μ†Œλ“œμ— λŒ€ν•΄μ„œλŠ” 사싀인 것 κ°™μ§€λ§Œ ν•„λ“œμ— λŒ€ν•΄μ„œλŠ” 사싀이 μ•„λ‹Œ 것 κ°™μŠ΅λ‹ˆλ‹€.

<1.2.1μ—μ„œ μž‘λ™ν–ˆμœΌλ―€λ‘œ μ–΄λ–€ λ²„μ „μ—μ„œλ„ μž‘λ™ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” κ²½μš°μ—λ„ >1.2.1, <2.0μ—μ„œλ„ μž‘λ™ν•  κ²ƒμœΌλ‘œ μ˜ˆμƒν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰