How to get method arguments?
In Java we can use reflection to get the method arguments in an array, we can also get the name of argument.
Do we have similar features in ObjectScript?
Thanks!
Comments
You can use the %Dictionary classes to get details of the class and methods:
USER>do $System.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
The command prefix is currently set to: <<nothing>>.
Enter <command>, 'q' to quit, '?' for help.
[SQL]USER>>SELECT FormalSpec FROM %Dictionary.MethodDefinition WHERE parent='My.Test.Class' AND Name='TestMethod'
1. SELECT FormalSpec FROM %Dictionary.MethodDefinition WHERE parent='My.Test.Class' AND Name='TestMethod'
FormalSpec
param1:%String,param2:%Numeric
1 Rows(s) Affected
statement prepare time(s)/globals/cmds/disk: 0.0033s/321/1482/0ms
execute time(s)/globals/cmds/disk: 0.0006s/3/385/0ms
cached query class: %sqlcq.USER.cls14
---------------------------------------------------------------------------
[SQL]USER>>Thank you!
You could create an abstract class, which adds all the information you need to your class(es), see the example below.
Then include this class into the class(es) where you need this kind of information:
Class Your.Class Extends (%Persistent, DC.ClassInfo) { ... }
Class Your.OtherClass Extends (%Persistent, DC.ClassInfo) { ... }and use it as follows:
set allProps = ##class(Your.Class).PropertyInfo()
write allProps.%ToJSON() --> [prop1, prop2, ...] // here you get the names of all properties
set oneProp = ##class(Your.Class).PropertyInfo("aPropertyName") --> {"Type":"%String"} // Info about one propertyThe same goes for the methods too.
Class definition for the (example) DC.ClassInfo class:
Class DC.ClassInfo [ Abstract ]
{
/// Return information about properties
///
/// 1) return list of all properties
/// obj.PropertyInfo() --> [Propertynam1, Propertyname2, Propertyname3, ...]
///
/// 2) return info for a specific property
/// obj.PropertyInfo(propertyname) --> {"Type":type, "MaxLen":nn, "Scale":n, ...}
///
ClassMethod PropertyInfo(name = "") As %DynamicObject [ CodeMode = objectgenerator ]
{
set prp=%compiledclass.Properties, all={}
for i=1:1:prp.Count() {
set p=prp.GetAt(i), inf={}
// Add all the infos you need...
set inf.Type=p.Type
set x=p.Parameters.GetAt("MAXLEN") set:x]"" inf.MaxLen=x
set x=p.Parameters.GetAt("SCALE") set:x]"" inf.Scale=x
do all.%Set(p.Name,inf)
}
do %code.WriteLine($c(9)_"set prp="_all.%ToJSON())
do %code.WriteLine($c(9)_"if name]"""" quit prp.%Get(name)")
do %code.WriteLine($c(9)_"set itr=prp.%GetIterator(), names=[]")
do %code.WriteLine($c(9)_"while itr.%GetNext(.k) { do names.%Push(k) }")
do %code.WriteLine($c(9)_"quit names")
quit $$$OK
}
/// Return information about properties
///
/// 1) return list of all properties
/// obj.PropertyInfo() --> [Propertynam1, Propertyname2, Propertyname3, ...]
///
/// 2) return info for a specific property
/// obj.PropertyInfo(propertyname) --> {"Type":type, "MaxLen":nn, "Scale":n, ...}
///
ClassMethod MethodInfo(name = "") As %DynamicObject [ CodeMode = objectgenerator ]
{
set mth=%compiledclass.Methods, all={}
for i=1:1:mth.Count() {
set m=mth.GetAt(i)
// Add all the infos you need...
set inf={}, spc=m.FormalSpecParsed
set inf.SqlProc=m.SqlProc
set inf.ClassMethod=m.ClassMethod
set inf.ReturnType=m.ReturnType
set inf.Args=[]
for j=1:1:$ll(spc) {
set arg={}, itm=$li(spc,j), arg.Name=$li(itm), arg.Type=$li(itm,2)
set arg.ByRef=$li(itm,3)="&", arg.DefValue=$li(itm,4)
do inf.Args.%Push(arg)
}
do all.%Set(m.Name,inf)
}
do %code.WriteLine($c(9)_"set mth="_all.%ToJSON())
do %code.WriteLine($c(9)_"if name]"""" quit mth.%Get(name)")
do %code.WriteLine($c(9)_"set itr=mth.%GetIterator(), names=[]")
do %code.WriteLine($c(9)_"while itr.%GetNext(.k) { do names.%Push(k) }")
do %code.WriteLine($c(9)_"quit names")
quit $$$OK
}
}The class should work, but it's only partially tested. Also, you may want to omit all the inherited properties and methods
set p=prp.GetAt(i) continue:p.Origin '= %class.Name // skip inherited propps
set m=mth.GetAt(i) continue:m.Origin '= %class.Name // skip inherited methodsit's up to you. Also you can add other informations, depending on your needs, see the respective classes (%Dictionary.CompiledClass, %Dictionary.CompiledProperties and %Dictionary.CompiledMethods)
Thank you!