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λ₯Ό νμ₯ν μΈν°νμ΄μ€μ λ©μλμ μ‘μΈμ€νλ λ° λ¬Έμ κ° μμμ΅λλ€.
λ‘컬μμ μ¬νν μ μμ΅λλ€. 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λ₯Ό λ§λλ λμ λμΌν μλͺ
μΌλ‘ μμ λ©μλλ₯Ό λ체νλ κ²μ λμν©λλ€. μ΄λ μ’μ μ λ΅μΈ κ² κ°μ΅λλ€.
λ³΄νΈ νλκ° μμ§ μμ΅λλ€!
μ΄ μ€ μ public
μμ protected
νλ©΄ ν
μ€νΈμ μ€ν¨ν©λλ€.
λΉκ³΅κ°/보νΈλ λ©μλ/νλλ₯Ό μ ν λ ΈμΆν΄μΌ νλμ§ μ¬λΆμ λν΄ #500μ λν ν λ‘ μ΄ μμ΅λλ€.
λλ κ·Έκ²μ΄ λ€λ₯΄λ€κ³ μκ°ν©λλ€. νμ¬ μ°λ¦¬λ λͺ¨λ κ²μ κ°μ§κ³ μμ΄μΌ νλ©°, μμ μ ν΅ν΄ λ©μλμ λν΄ μ¬μ€μΈ κ² κ°μ§λ§ λΆλͺ ν νλμ λν΄μλ μ¬μ€μ΄ μλλ―λ‘(κ·Έλ¦¬κ³ μλ§λ κ²°μ½ κ·Έλ μ§ μμμ΅λκΉ?) λ¨Όμ ν΄κ²°ν΄μΌ ν λ²κ·ΈλΌκ³ μκ°ν©λλ€. , κ·Έλ° λ€μ κ°μΈ μ 보 λ³΄νΈ μμ€μ λ°λΌ λ³΄κ³ μΆμ λ©μλ/νλ νν°λ§μ νμ©ν μ§ μ¬λΆ. μ΄ λ²κ·Έκ° μ’ λ£λμμΌλ―λ‘ ν΄λΉ μ¬λ‘μ λν΄ μ λ²κ·Έλ₯Ό μ¬λ κ²μ΄ μ’μ΅λλ€.
λ©μλμ λν΄μλ μ¬μ€μΈ κ² κ°μ§λ§ νλμ λν΄μλ μ¬μ€μ΄ μλ κ² κ°μ΅λλ€.
<1.2.1μμ μλνμΌλ―λ‘ μ΄λ€ λ²μ μμλ μλνμ§ μμμΌ νλ κ²½μ°μλ >1.2.1, <2.0μμλ μλν κ²μΌλ‘ μμν©λλ€.
κ°μ₯ μ μ©ν λκΈ
λμΌν λ¬Έμ λ₯Ό κ΄μ°°νλλ° μνΌν΄λμ€ λ©μλλ 1.2.1μμ μ‘μΈμ€ν μ μμ§λ§ λͺ¨λ κ²μ΄ 1.2.0μμ μλν©λλ€. μ΄κ²μ λ§€μ° λΆμΎν λ²κ·Έμ λλ€. 1.2.1 릴리μ€λ₯Ό μ κ±°νκ±°λ μ¬μ©ν μ μλ κ²μΌλ‘ νμνλ κ²μ΄ ν©λ¦¬μ μ΄λΌκ³ μκ°νμ§ μμ΅λκΉ?