Kaip paskambinti „Java“ metodu, kai metodo pavadinimas vadinamas eilute?

Jei turiu du kintamuosius:

 Object obj; String methodName = "getName"; 

Nežinant obj klasės, kaip galėčiau paskambinti methodName nurodytu metodu?

Skambintas metodas neturi parametrų ir grąžina reikšmę String . Tai „Java“ pupelių getter.

505
02 окт. nustatė brasskazoo 02 okt. 2008-10-02 08:15 '08, 08:15, 2008-10-02 08:15
@ 18 atsakymų

Kodavimas iš klubo, tai bus kažkas panašaus:

 java.> 

Parametrai identifikuoja labai konkretų jums reikalingą metodą (jei yra keli perkrovimai, jei metodas neturi argumentų, nurodykite tik methodName ).

Tada jūs vadinate šį metodą, paskambinę

 try { method.invoke(obj, arg1, arg2,...); } catch (IllegalArgumentException e) { ... } catch (IllegalAccessException e) { ... } catch (InvocationTargetException e) { ... } 

Vėlgi palikite argumentus .invoke jei jų neturite. Bet taip. Skaitykite apie „ Java Reflection“.

742
02 окт. Henrik Paul 02 d 2008-10-02 08:30 '08, 08:30, 2008-10-02 08:30

Naudokite atspindį:

http://java.sun.com/docs/books/tutorial/reflect/member/methodInvocation.html

 Class<?> c = Class.forName("class name"); Method method = c.getDeclaredMethod ("method name", parameterTypes) method.invoke (objectToInvokeOn, params) 

Kur

border=0

„klasės pavadinimas“ yra klasės pavadinimas

objectToInvokeOn yra objekto tipo objektas ir yra objektas, kurį norite skambinti metodu „metodo pavadinimas“ - tai metodo, kurį norite skambinti, pavadinimas

Parametrų tipai yra [Class] tipo, o metodu priimami matavimo parametrai.

Params yra Object [] tipo ir deklaruoja parametrus, kurie bus perduoti metodui.

138
02 окт. Atsakymas, kurį pateikė Owen 02 Oct 2008-10-02 08:21 '08, 08:21, 2008-10-02 08:21

Tiems, kuriems reikia „Java 7“ tiesioginio kodo pavyzdžio:

Dog klasė:

 package com.mypackage.bean; public class Dog { private String name; private int age; public Dog() { // empty constructor } public Dog(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void printDog(String name, int age) { System.out.println(name + " is " + age + " year(s) old."); } } 

ReflectionDemo klasė:

 package com.mypackage.demo; import java.> 

Išvada: Mishka is 3 year(s) old.


Galite skambinti konstruktoriui tokiais parametrais:

 Constructor<?> dogConstructor = dogClass.getConstructor(String.class, int.class); Object dog = dogConstructor.newInstance("Hachiko", 10); 

Arba galite ištrinti

 String dogClassName = "com.mypackage.bean.Dog"; Class<?> dogClass = Class.forName(dogClassName); Object dog = dogClass.newInstance(); 

ir daryti

 Dog dog = new Dog(); Method method = Dog.class.getMethod(methodName, ...); method.invoke(dog, ...); 

Rekomenduojamas skaitymas: naujų klasių kūrimas

50
05 июня '15 в 19:31 2015-06-05 19:31 atsakymas pateikiamas sidabro birželio 15 d., 15 val. 19:31 2015-06-05 19:31

Šis metodas gali būti vadinamas taip. Taip pat yra daugiau funkcijų (patikrinkite api atspindį), tačiau tai yra paprasčiausias:

 import java.> 
49
02 окт. Petro Maceko atsakymas 02 okt. 2008-10-02 08:33 '08, 08:33, 2008-10-02 08:33

Pirma, ne. Venkite tokio kodo. Tai taip pat labai blogas kodas ir nesaugus (žr. 6 skyrių „ Saugaus kodavimo taisyklės„ Java “programavimo kalbai, 2.0 versija ).

Jei turite tai padaryti, pirmenybė teikiama java.beans. Pupelės apsupia atspindžius, suteikdamos palyginti saugią ir reguliarų prieigą.

16
02 окт. Atsakyti Tom Hawtin - tackline 02 oct. 2008-10-02 17:08 '08 at 5:08 pm 2008-10-02 17:08

Norėdami užpildyti savo kolegų atsakymus, galite atkreipti dėmesį į:

  • statiniai arba pavyzdiniai skambučiai (vienu atveju jums nereikia klasės egzemplioriaus, kitais atvejais jums gali tekti naudoti esamą numatytąjį konstruktorių ), kuris gali arba negali būti)
  • skambinant viešam ar ne viešajam metodui (pastaruoju atveju, jums reikia skambinti „setAccessible“ prie „doPrivileged“ bloko metodo) , kitas findbugs nebus laimingas
  • įterpti kitą tvarkomą išimtį taikomojoje programoje, jei norite išmesti daugybę „Java“ sistemos išimčių (taigi ir toliau pateikiamame kode CCException)

Čia yra senas java1.4 kodas, į kurį atsižvelgiama į šiuos momentus:

  public static Object reflectionCall(final Object aninstance, final String classname, final String amethodname, final Class[] parameterTypes, final Object[] parameters) throws CCException { Object res;// = null; try { Class aclass;// = null; if(aninstance == null) { aclass = Class.forName(classname); } else { aclass = aninstance.getClass(); } //Class[] parameterTypes = new Class[]{String[].class}; final Method amethod = aclass.getDeclaredMethod(amethodname, parameterTypes); AccessController.doPrivileged(new PrivilegedAction() { public Object run() { amethod.setAccessible(true); return null; // nothing to return } }); res = amethod.invoke(aninstance, parameters); } catch (final ClassNotFoundException e) { throw new CCException.Error(PROBLEM_TO_ACCESS+classname+CLASS, e); } catch (final SecurityException e) { throw new CCException.Error(PROBLEM_TO_ACCESS+classname+GenericConstants.HASH_DIESE+ amethodname + METHOD_SECURITY_ISSUE, e); } catch (final NoSuchMethodException e) { throw new CCException.Error(PROBLEM_TO_ACCESS+classname+GenericConstants.HASH_DIESE+ amethodname + METHOD_NOT_FOUND, e); } catch (final IllegalArgumentException e) { throw new CCException.Error(PROBLEM_TO_ACCESS+classname+GenericConstants.HASH_DIESE+ amethodname + METHOD_ILLEGAL_ARGUMENTS+String.valueOf(parameters)+GenericConstants.CLOSING_ROUND_BRACKET, e); } catch (final IllegalAccessException e) { throw new CCException.Error(PROBLEM_TO_ACCESS+classname+GenericConstants.HASH_DIESE+ amethodname + METHOD_ACCESS_RESTRICTION, e); } catch (final InvocationTargetException e) { throw new CCException.Error(PROBLEM_TO_ACCESS+classname+GenericConstants.HASH_DIESE+ amethodname + METHOD_INVOCATION_ISSUE, e); } return res; } 
12
02 окт. atsakymas pateikiamas VonC 02 okt. 2008-10-02 08:51 '08 at 8:51 am 2008-10-02 08:51
 //Step1 - Using string funClass to convert to class String funClass = "package.myclass"; Class c = Class.forName(funClass); //Step2 - instantiate an object of the class abov Object o = c.newInstance(); //Prepare array of the arguments that your function accepts, lets say only one string here Class[] paramTypes = new Class[1]; paramTypes[0]=String.class; String methodName = "mymethod"; //Instantiate an object of type method that returns you method name Method m = c.getDeclaredMethod(methodName, paramTypes); //invoke method with actual params m.invoke(o, "testparam"); 
10
30 апр. atsakymas yra anujin 30 balandis. 2013-04-30 08:46 '13, 8:46, 2013-04-30 08:46
 Object obj; Method method = obj.getClass().getMethod("methodName", null); method.invoke(obj, null); 
8
02 окт. atsakymą pateikė Ash Kim 02 okt. 2008-10-02 08:22 '08 at 8:22 2008-10-02 08:22

Tai panaši į tai, ką galima padaryti naudojant „Java Reflection“ paketą.

http://java.sun.com/developer/technicalArticles/ALT/Reflection/index.html

Visų pirma skiltyje Skambinimo metodai pavadinimu:

importuoti java.>

 public class method2 { public int add(int a, int b) { return a + b; } public static void main(String args[]) { try { Class cls = Class.forName("method2"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Method meth = cls.getMethod( "add", partypes); method2 methobj = new method2(); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj = meth.invoke(methobj, arglist); Integer retval = (Integer)retobj; System.out.println(retval.intValue()); } catch (Throwable e) { System.err.println(e); } } } 
5
02 окт. atsakymas pateikiamas zxcv 02 okt. 2008-10-02 08:22 '08 at 8:22 2008-10-02 08:22

Jei skambinate kelis kartus, galite naudoti naują „Java 7“ įvestą metodų rankenėlę.

 Object obj = new Point( 100, 200 ); String methodName = "toString"; Class<String> resultType = String.class; MethodType mt = MethodType.methodType( resultType ); MethodHandle methodHandle = MethodHandles.lookup().findVirtual( obj.getClass(), methodName, mt ); String result = resultType.cast( methodHandle.invoke( obj ) ); System.out.println( result ); // java.awt.Point[x=100,y=200] 
4
01 марта '17 в 1:02 2017-03-01 01:02 Atsakymą pateikė Christian Ullenboom kovo 1 d. 17 d. 1:02 2017-03-01 01:02
  Method method = KeyWords.class.getMethod(Keyword); String status = (String) method.invoke(method); 

Raktiniai žodžiai yra klasės pavadinimas, o KeyWord yra kintamasis.

3
27 дек. Atsakymas pateikiamas Subrahmanya Prasad 27 d. 2016-12-27 08:10 '17, 8:10 am 2016-12-27 08:10

Žr. Šį kodą, kuris gali padėti jums.

 public static void main(String args[]) { MethodClass obj = new MethodClass(); Method[] methods = obj.getClass().getMethods(); try { for(int i=0;i<methods.length;i++) { String name=methods[i].getName(); if(name.equals("A")) { methods[i].invoke(obj,"Test Parameters of A"); return; } } } catch(Exception ex) { System.out.println(ex.getMessage()); } } 

Ačiū.

3
20 мая '16 в 9:31 2016-05-20 09:31 atsakymą davė Rahul Karankal gegužės 16, 16 d. 9:31 2016-05-20 09:31

Student.java

 class Student{ int rollno; String name; void m1(int x,int y){ System.out.println("add is" +(x+y)); } private void m3(String name){ this.name=name; System.out.println("danger yappa:"+name); } void m4(){ System.out.println("This is m4"); } } 

StudentTest.java

 import java.> 
2
30 июля '17 в 5:20 2017-07-30 05:20 atsakymą pateikė vartotojo8387971 liepos 30 d. 17 d. 5:20 2017-07-30 05:20

Aš tai darau:

 try { YourClass yourClass = new YourClass(); Method method = YourClass.class.getMethod("yourMethodName", ParameterOfThisMethod.class); method.invoke(yourClass, parameter); } catch (Exception e) { e.printStackTrace(); } 
2
20 сент. atsakymą pateikė Marcel Jacques Machado 20 sep. 2016-09-20 22:02 '16 at 10:02 pm 2016-09-20 22:02

Jūs turite naudoti refleksiją, kad inicijuotumėte klasės objektą, tada šiame klasei būdingą metodą, ir tada skambinkite šiuo metodu objektui su pasirinktiniais parametrais. Nepamirškite įterpti kito fragmento į bandomąjį bloką.

Tikiuosi, kad tai padės!

 Class<?> aClass = Class.forName(FULLY_QUALIFIED_CLASS_NAME); Method method = aClass.getMethod(methodName, YOUR_PARAM_1.class, YOUR_PARAM_2.class); method.invoke(OBJECT_TO_RUN_METHOD_ON, YOUR_PARAM_1, YOUR_PARAM_2); 
1
09 июля '15 в 17:51 2015-07-09 17:51 Atsakymą davė nurxyz liepos 09-15 dienomis 17:51 2015-07-09 17:51

Tai puikiai tinka man:

 public class MethodInvokerClass { public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, ClassNotFoundException, InvocationTargetException, InstantiationException { Class c = Class.forName(MethodInvokerClass.class.getName()); Object o = c.newInstance(); Class[] paramTypes = new Class[1]; paramTypes[0]=String.class; String methodName = "countWord"; Method m = c.getDeclaredMethod(methodName, paramTypes); m.invoke(o, "testparam"); } public void countWord(String input){ System.out.println("My input "+input); } 

}

Išeiti:

My input testparam

Aš galiu skambinti metodu, perduodamas jo pavadinimą į kitą metodą (pavyzdžiui, pagrindinį).

1
09 окт. Karo La atsakymas spalio 9 d. 2015-10-09 21:29 '15 - 21:29 2015-10-09 21:29

naudojant import java.>

 public static Object launchProcess(String className, String methodName, Class<?>[] argsTypes, Object[] methodArgs) throws Exception { Class<?> processClass = Class.forName(className); // convert string classname to class Object process = processClass.newInstance(); // invoke empty constructor Method aMethod = process.getClass().getMethod(methodName,argsTypes); Object res = aMethod.invoke(process, methodArgs); // pass arg return(res); } 

ir taip jūs naudojate:

 String className = "com.example.helloworld"; String methodName = "print"; Class<?>[] argsTypes = {String.class, String.class}; Object[] methArgs = { "hello", "world" }; launchProcess(className, methodName, argsTypes, methArgs); 
1
23 нояб. atsakymas dina 23 lapkričio. 2016-11-23 10:32 '16 at 10:32 2016-11-23 10:32

gana paprastas ir patikimas būdas man paprasčiausiai padaryti metodą, kuriuo raginamas metodas:

 public static object methodCaller(String methodName) { if(methodName.equals("getName")) return className.getName(); } 

kai jums reikia paskambinti metodas, tiesiog įdėkite kažką panašaus

 //calling a toString method is unnessary here, but i use it to have my programs to both rigid and self-explanitory System.out.println(methodCaller(methodName).toString()); 
-8
16 июня '10 в 23:21 2010-06-16 23:21 atsakymas pateikiamas SMayne birželio 16, 10, 23:21 2010-06-16 23:21

Kiti klausimai apie arba užduoti klausimą