@@ -10,54 +10,73 @@ class methods, fields, and source code URL.
1010from scyjava ._types import isjava , jinstance , jclass
1111
1212
13- def jreflect (data , aspect : str ) -> List [Dict [str , Any ]]:
13+ def jreflect (data , aspect : str = "all" ) -> List [Dict [str , Any ]]:
1414 """
1515 Use Java reflection to introspect the given Java object,
1616 returning a table of its available methods or fields.
1717
1818 :param data: The object or class or fully qualified class name to inspect.
19- :param aspect: Either "methods" or "fields"
20- :return: List of dicts with keys: "name", "static ", "arguments", and "returns".
19+ :param aspect: One of: "all", "constructors", "fields", or "methods".
20+ :return: List of dicts with keys: "name", "mods ", "arguments", and "returns".
2121 """
2222
23+ aspects = ["all" , "constructors" , "fields" , "methods" ]
24+ if aspect not in aspects :
25+ raise ValueError ("aspect must be one of {aspects}" )
26+
2327 if not isjava (data ) and isinstance (data , str ):
2428 try :
2529 data = jimport (data )
26- except Exception as err :
27- raise ValueError (f"Not a Java object { err } " )
30+ except Exception as e :
31+ raise ValueError (
32+ f"Object of type '{ type (data ).__name__ } ' is not a Java object"
33+ ) from e
2834
29- Modifier = jimport ("java.lang.reflect.Modifier" )
3035 jcls = data if jinstance (data , "java.lang.Class" ) else jclass (data )
3136
32- if aspect == "methods" :
33- cls_aspects = jcls .getMethods ()
34- elif aspect == "fields" :
35- cls_aspects = jcls .getFields ()
36- else :
37- return '`aspect` must be either "fields" or "methods"'
37+ Modifier = jimport ("java.lang.reflect.Modifier" )
38+ modifiers = {
39+ attr [2 :].lower (): getattr (Modifier , attr )
40+ for attr in dir (Modifier )
41+ if attr .startswith ("is" )
42+ }
43+
44+ members = []
45+ if aspect in ["all" , "constructors" ]:
46+ members .extend (jcls .getConstructors ())
47+ if aspect in ["all" , "fields" ]:
48+ members .extend (jcls .getFields ())
49+ if aspect in ["all" , "methods" ]:
50+ members .extend (jcls .getMethods ())
3851
3952 table = []
4053
41- for m in cls_aspects :
42- name = m .getName ()
43- if aspect == "methods" :
44- args = [c .getName () for c in m .getParameterTypes ()]
45- returns = m .getReturnType ().getName ()
46- elif aspect == "fields" :
47- args = None
48- returns = m .getType ().getName ()
49- mods = Modifier .isStatic (m .getModifiers ())
54+ for member in members :
55+ mtype = str (member .getClass ().getName ()).split ("." )[- 1 ].lower ()
56+ name = member .getName ()
57+ modflags = member .getModifiers ()
58+ mods = [name for name , hasmod in modifiers .items () if hasmod (modflags )]
59+ args = (
60+ [ptype .getName () for ptype in member .getParameterTypes ()]
61+ if hasattr (member , "getParameterTypes" )
62+ else None
63+ )
64+ returns = (
65+ member .getReturnType ().getName ()
66+ if hasattr (member , "getReturnType" )
67+ else (member .getType ().getName () if hasattr (member , "getType" ) else None )
68+ )
5069 table .append (
5170 {
71+ "type" : mtype ,
5272 "name" : name ,
53- "static " : mods ,
73+ "mods " : mods ,
5474 "arguments" : args ,
5575 "returns" : returns ,
5676 }
5777 )
58- sorted_table = sorted (table , key = lambda d : d ["name" ])
5978
60- return sorted_table
79+ return table
6180
6281
6382def _map_syntax (base_type ):
@@ -98,7 +117,7 @@ def _make_pretty_string(entry, offset):
98117 return_val = f"{ entry ['returns' ].__str__ ():<{offset }} "
99118 # Handle whether to print static/instance modifiers
100119 obj_name = f"{ entry ['name' ]} "
101- modifier = f"{ '*' :>4} " if entry ["static " ] else f"{ '' :>4} "
120+ modifier = f"{ '*' :>4} " if "static" in entry ["mods " ] else f"{ '' :>4} "
102121
103122 # Handle fields
104123 if entry ["arguments" ] is None :
0 commit comments