Yöntem adı dize olarak verildiğinde Java yöntemini nasıl çağırabilirim?


684

İki değişkenim varsa:

Object obj;
String methodName = "getName";

Sınıfını bilmeden, üzerinde objtanımlanan yöntemi nasıl çağırabilirim methodName?

Çağrılan yöntemin parametreleri ve bir Stringdönüş değeri yoktur. Bu var bir Java fasulye için bir alıcı .


3
Ya yansıma API'sini kullanın ya da harika
Peter Kelley

Yanıtlar:


972

Kalçadan kodlama, şöyle bir şey olurdu:

java.lang.reflect.Method method;
try {
  method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }
  catch (NoSuchMethodException e) { ... }

Parametreler, ihtiyacınız olan çok özel yöntemi tanımlar (eğer aşırı yüklenmiş birkaç yöntem varsa, yöntemin argümanı yoksa, sadece verin methodName).

Sonra bu yöntemi çağırarak

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

Yine, .invokeeğer varsa , argümanları dışarıda bırakın . Ama evet. Java Reflection hakkında devamını oku


2
Java'nın tür silme kullandığından biraz üzülmüştü, ama en azından Reflection'ın beni tekrar neşelendirdiğini bilmek: D Ve şimdi Java 8'deki lambdaslarla dil gerçekten modern gelişim ile hızlanıyor. Şimdi eksik olan tek şey alıcılar ve ayarlayıcılar veya C # 'da bilindiği gibi özellikler için yerel destek.
7hi4g0

120
Adil değil -1. Henrik muhtemelen ezici istisnaları savunmuyor ve onlar için hiçbir şey yazmadı çünkü sadece yansıma göstermeye çalışıyor.
çekti

70
Artı bir potansiyel istisnalar göstermek için. Bunu yazmış olsaydım ... catch (Exception e) {...
mikbanUtah

1
Ben "değişken başlatıldı olmayabilir" var methodiçinde method.invoke(obj, arg1, arg2,...);. Bir method = null;çözer sorunu ancak cevap bahsetmesi kötü bir fikir değil.
Amin

2
@ DeaMon1 Java yöntemleri "çıkış kodları" kullanmaz, ancak yöntem bir şey döndürürse, döndürdüğü her şeyi döndürür invoke. Yöntemi çalıştırırken bir kural dışı durum oluşursa, kural dışı durum bir InvocationTargetException.
ThePyroEagle

194

Yansıtmadan yöntem çağırma kullanın :

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

Nerede:

  • "class name" sınıfın adı
  • objectToInvokeOn Object türündedir ve yöntemi çağırmak istediğiniz nesnedir.
  • "method name" aramak istediğiniz yöntemin adı
  • parameterTypestiptedir Class[]ve yöntem alır parametreleri beyan
  • paramstüründe Object[]olup yönteme iletilecek parametreleri bildirir

Harika, getDeclaredMethod () ile haklı olduğunu düşünüyorum, muhtemelen getMethod () 'den daha' güvenli '..
brasskazoo

22
Yanlış. Evet, getDeclaredMethod özel ve korumalı yöntemlerle çalışır. AMA: Üst sınıflarda tanımlanan yöntemlerle (kalıtsal yöntemler) çalışmaz. Yani, ne yapmak istediğinize güçlü bir şekilde bağlıdır. Çoğu durumda, yöntemin tanımlandığı sınıftan bağımsız olarak çalışmasını istersiniz.
jrudolph

Ve "class" dosyasını nereye koymalıyım? tercihen Eclipse IDE için açıklayın
Dr.jacky

@ Mr.Hyde sınıf yolunda.
Stijn de Witt

Aradığım yöntem hiç parametre kabul etmiyorsa ve method.invoke () içine ne koymalıyım? Hala boş bir nesne dizisi olmalı, ikinci parametre sağlamak zorunda gibi görünüyor?
Igor

101

Java 7'de düz kod örneği isteyenler için:

Dog sınıf:

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 sınıf:

package com.mypackage.demo;

import java.lang.reflect.*;

public class ReflectionDemo {

    public static void main(String[] args) throws Exception {
        String dogClassName = "com.mypackage.bean.Dog";
        Class<?> dogClass = Class.forName(dogClassName); // convert string classname to class
        Object dog = dogClass.newInstance(); // invoke empty constructor

        String methodName = "";

        // with single parameter, return void
        methodName = "setName";
        Method setNameMethod = dog.getClass().getMethod(methodName, String.class);
        setNameMethod.invoke(dog, "Mishka"); // pass arg

        // without parameters, return string
        methodName = "getName";
        Method getNameMethod = dog.getClass().getMethod(methodName);
        String name = (String) getNameMethod.invoke(dog); // explicit cast

        // with multiple parameters
        methodName = "printDog";
        Class<?>[] paramTypes = {String.class, int.class};
        Method printDogMethod = dog.getClass().getMethod(methodName, paramTypes);
        printDogMethod.invoke(dog, name, 3); // pass args
    }
}

Çıktı: Mishka is 3 year(s) old.


Yapıcıyı şu şekilde parametrelerle çağırabilirsiniz:

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

Alternatif olarak,

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

ve yap

Dog dog = new Dog();

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

Önerilen okuma: Yeni Sınıf Örnekleri Oluşturma


1
Burada en iyi cevap. Tam ve özlü
Reuben JaMes Aveño Gruta

1
Doğru en iyi cevap.
Dhara Patel

Nereye Methoditiraz ediyorsunuz?
parlad

Yansıtma paketinden.
gümüş

55

Yöntem böyle çağrılabilir. Ayrıca daha fazla olasılık var (yansıma API'sini kontrol edin), ancak bu en basit olanı:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Assert;
import org.junit.Test;

public class ReflectionTest {

    private String methodName = "length";
    private String valueObject = "Some object";

    @Test
    public void testGetMethod() throws SecurityException, NoSuchMethodException, IllegalArgumentException,
            IllegalAccessException, InvocationTargetException {
        Method m = valueObject.getClass().getMethod(methodName, new Class[] {});
        Object ret = m.invoke(valueObject, new Object[] {});
        Assert.assertEquals(11, ret);
    }



}

7
+1, OP'nin kendi sorusunda "parametre yok" olarak belirttiğini (ve benim de aradığım şey olduğu için) tanıyan tek cevap için.
John Fitzpatrick

16

İlk olarak, yapma. Bu tür kodlardan kaçının. Gerçekten kötü kod ve güvensiz olma eğilimindedir ( Java Programlama Dili, sürüm 2.0 için Güvenli Kodlama Yönergeleri'nin 6. bölümüne bakın ).

Yapmanız gerekiyorsa, java. fasulyeyi yansımayı tercih edin. Fasulye yansımayı, nispeten güvenli ve geleneksel erişime izin vererek sarar.


11
Katılmıyorum. Güvenli olmak için böyle bir kod yazmak çok kolay ve bunu birden çok dilde yaptım. Örneğin, bir dizi izin verilen yöntem oluşturulabilir ve yalnızca bir yöntem kümede adıysa çağrılabilir. Daha da güvenli (yine de kemik başı basit), izin verilen her yöntemi belirli bir durumla sınırlar ve iplik / arabirim / kullanıcı / bu kriterlere uymayan herhangi bir yöntemin çağrılmasına izin vermez.
JSON

Bu tür konular hakkında asla bu kadar kategorik olmayın. Şu anda, kullanıcının web arayüzlerini kullanarak rastgele nesneler üzerinde keyfi görevleri tanımlamasına izin vermek için basit bir program oluşturuyorum. Gerçekten, güvensiz olduğunu biliyorum, ancak yapılandırma alındıktan sonra uygun test yapılır ve programcı olmayanların görevleri kolayca yapılandırmasını sağlar ve ayrıca programlara özel kodları genel koda bağlama yeteneği verir (thats Bölüm, GUI'yi güncellemek zorunda kalmadan web arabirimi aracılığıyla hangi yöntemleri kullanacaklarını yapılandırmak için yansıma kullanıyorum).
DGoiko

14

Meslektaşımın cevaplarını tamamlamak için şunlara dikkat etmek isteyebilirsiniz:

  • statik veya örnek çağrıları (bir durumda sınıfın bir örneğine ihtiyacınız yoktur, diğer durumda, orada olabilecek veya olmayabilecek mevcut bir varsayılan kurucuya güvenmeniz gerekebilir)
  • genel veya genel olmayan yöntem çağrısı (ikincisi için, bir doPrivileged bloğundaki yöntemde setAccessible öğesini çağırmanız gerekir , diğer findbugs mutlu olmayacaktır )
  • çok sayıda java sistemi istisnasını geri almak istiyorsanız, yönetilebilir bir uygulama istisnası içine almak (bu nedenle aşağıdaki kodda CCException)

İşte bu noktaları dikkate alan eski bir java1.4 kodu:

/**
 * Allow for instance call, avoiding certain class circular dependencies. <br />
 * Calls even private method if java Security allows it.
 * @param aninstance instance on which method is invoked (if null, static call)
 * @param classname name of the class containing the method 
 * (can be null - ignored, actually - if instance if provided, must be provided if static call)
 * @param amethodname name of the method to invoke
 * @param parameterTypes array of Classes
 * @param parameters array of Object
 * @return resulting Object
 * @throws CCException if any problem
 */
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
Object obj;

Method method = obj.getClass().getMethod("methodName", null);

method.invoke(obj, null);

Nesnenin en az değeri / değeri olmalıdır.
Lova Chittumuri

Bu, ihtiyacım olan şey için gerçekten iyi çalıştı. Zaten somutlaştırılmış ve sadece bir yöntem elde etmek için gerekli bir sınıf vardı. İstisnalar için yakalama eklemek iyi bir fikirdir, ancak aksi takdirde bu benim için mükemmel çalıştı. Ben null istisnaları önlemek için benim yol nullables kullanmak olduğunu düşünüyorum, ama çok sınırlı bir yöntem adları aralığı (tam anlamıyla sadece 1'den 4'e bir sayaç) kullanıyordum.
Jain Waldrip

12
//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");

8

Aramayı birkaç kez yaparsanız, Java 7'de tanıtılan yeni yöntem tutamaçlarını kullanabilirsiniz. Burada, bir String döndürme yönteminize gidiyoruz:

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]

1
Gelecekteki okuyuculara; Performansı önemsiyorsanız, invokeExactmümkün olduğunca kullanmak istersiniz . Bunun için, çağrı sitesi imzası tam olarak olsa yöntem tanıtıcı türüyle eşleşmelidir. Çalışmak için genellikle biraz uğraşmak gerekir. Bu durumda, ilk parametreyi şununla kullanmanız gerekir: methodHandle = methodHandle.asType(methodHandle.type().changeParameterType(0, Object.class));ve sonra çağırınString result = (String) methodHandle.invokeExact(obj);
Jorn Vernee

7

Bu, Java Yansıma paketi ile yapılabilen bir şey gibi geliyor.

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

Özellikle altında İsme Göre Yöntem Çağırma:

içe aktar java.lang.reflect. *;

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);
     }
  }
}

6

Dizin oluşturma (daha hızlı)

FunctionalInterfaceYöntemleri dizine eklemek için yöntemleri bir kapta kaydetmek için kullanabilirsiniz . Onları numaralarla çağırmak için dizi kapsayıcısını veya dizelerle çağırmak için hashmap'yi kullanabilirsiniz. Bu hile ile, yöntemlerinizi dinamik olarak daha hızlı çağırmak için dizinleyebilirsiniz .

@FunctionalInterface
public interface Method {
    double execute(int number);
}

public class ShapeArea {
    private final static double PI = 3.14;

    private Method[] methods = {
        this::square,
        this::circle
    };

    private double square(int number) {
        return number * number;
    }

    private double circle(int number) {
        return PI * number * number;
    }

    public double run(int methodIndex, int number) {
        return methods[methodIndex].execute(aNumber);
    }
}

Lambda sözdizimi

Ayrıca lambda sözdizimini de kullanabilirsiniz:

public class ShapeArea {
    private final static double PI = 3.14;

    private Method[] methods = {
        number -> {
            return number * number;
        },
        number -> {
            return PI * number * number;
        },
    };

    public double run(int methodIndex, int number) {
        return methods[methodIndex].execute(aNumber);
    }
}

1
Bu teknik yansımadan çok daha iyi görünüyor.
John O

Gerçekten daha mı iyi?
Dimitri Kopriwa

@DimitriKopriwa Dizinleme, CPU hesaplamaları yerine ram kullanma yöntemidir. Tamsayı indeksleme için algoritmanın zorluğu O(1).
Amir Fo

5
Method method = someVariable.class.getMethod(SomeClass);
String status = (String) method.invoke(method);

SomeClasssınıf ve someVariablebir değişkendir.


someVariable gerçekten bir nesneyse, someVariable.getClass () öğesini çağırın. Ayrıca, tek değişken olarak bir sınıfla getMethod () yöntemini çağıramazsınız. Her ikisi de yöntemle yöntemi çağırmaz. Doğru: someVariable.getClass (). GetMethod ("coolMethod", parametreClasses) .invoke (argümanlar);
Orangle

5

Bunu şu şekilde yapıyorum:

try {
    YourClass yourClass = new YourClass();
    Method method = YourClass.class.getMethod("yourMethodName", ParameterOfThisMethod.class);
    method.invoke(yourClass, parameter);
} catch (Exception e) {
    e.printStackTrace();
}

5

Lütfen aşağıdaki kodun size yardımcı olabileceğine bakın.

public static Method method[];
public static MethodClass obj;
public static String testMethod="A";

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

Teşekkürler....


Java'daki Dizeleri bu şekilde karşılaştırmazsınız. .Equals yöntemini kullanmalısınız. Aksi takdirde, sadece aynı nesne başvurusu olduklarını karşılaştırıyorsunuz ve aslında nesne referanslarını önemsemiyorsunuz - sadece dize içeriği eşleşiyor. Yöntemi yansıma yoluyla ada göre de alabilirsiniz, bu yüzden neden kendiniz yuvarlayacağınızdan emin değil misiniz?
Lo-Tan

5

İşte KULLANIM YÖNTEMLERİ:

Bağımsız Değişkenler olmadan bir yöntemi çağırmak için:

public static void callMethodByName(Object object, String methodName) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    object.getClass().getDeclaredMethod(methodName).invoke(object);
}

Bağımsız Değişkenlerle bir yöntemi çağırmak için:

    public static void callMethodByName(Object object, String methodName, int i, String s) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        object.getClass().getDeclaredMethod(methodName, int.class, String.class).invoke(object, i, s);
    }

Yukarıdaki yöntemleri aşağıdaki gibi kullanın:

package practice;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

public class MethodInvoke {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException {
        String methodName1 = "methodA";
        String methodName2 = "methodB";
        MethodInvoke object = new MethodInvoke();
        callMethodByName(object, methodName1);
        callMethodByName(object, methodName2, 1, "Test");
    }

    public static void callMethodByName(Object object, String methodName) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        object.getClass().getDeclaredMethod(methodName).invoke(object);
    }

    public static void callMethodByName(Object object, String methodName, int i, String s) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        object.getClass().getDeclaredMethod(methodName, int.class, String.class).invoke(object, i, s);
    }

    void methodA() {
        System.out.println("Method A");
    }

    void methodB(int i, String s) {
        System.out.println("Method B: "+"\n\tParam1 - "+i+"\n\tParam 2 - "+s);
    }
}

Çıktı:

Metot A  
Yöntem B:  
	Param1 - 1  
	Param 2 - Test

3

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.lang.reflect.Method;
public class StudentTest{

     public static void main(String[] args){

        try{

            Class cls=Student.class;

            Student s=(Student)cls.newInstance();


            String x="kichha";
            Method mm3=cls.getDeclaredMethod("m3",String.class);
            mm3.setAccessible(true);
            mm3.invoke(s,x);

            Method mm1=cls.getDeclaredMethod("m1",int.class,int.class);
            mm1.invoke(s,10,20);

        }
        catch(Exception e){
            e.printStackTrace();
        }
     }
}

1

Yansıma kullanmalısınız - önce bir sınıf nesnesi, sonra bu sınıftaki bir yöntem ve sonra bu yöntemi isteğe bağlı parametreleri olan bir nesneye çağırmalısınız. Aşağıdaki kod parçasını try- catch'e sarmayı unutmayın bloğuna

Umarım yardımcı olur!

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

Bu benim için iyi çalışıyor:

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);
}

}

Çıktı:

My input testparam

Adını başka bir yönteme (main gibi) geçirerek yöntemi çağırabilirim.


1

kullanma import java.lang.reflect.*;

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);
}

ve işte nasıl kullanıyorsunuz:

String className = "com.example.helloworld";
String methodName = "print";
Class<?>[] argsTypes = {String.class,  String.class};
Object[] methArgs = { "hello", "world" };   
launchProcess(className, methodName, argsTypes, methArgs);

0

JooR ile sadece:

on(obj).call(methodName /*params*/).get()

İşte daha ayrıntılı bir örnek:

public class TestClass {

    public int add(int a, int b) { return a + b; }
    private int mul(int a, int b) { return a * b; }
    static int sub(int a, int b) { return a - b; }

}

import static org.joor.Reflect.*;

public class JoorTest {

    public static void main(String[] args) {
        int add = on(new TestClass()).call("add", 1, 2).get(); // public
        int mul = on(new TestClass()).call("mul", 3, 4).get(); // private
        int sub = on(TestClass.class).call("sub", 6, 5).get(); // static
        System.out.println(add + ", " + mul + ", " + sub);
    }
}

Bu yazdırır:

3, 12, 1


-10

benim için oldukça basit ve aptal geçirmez bir yol sadece böyle bir yöntem arayan yöntemi yapmak olacaktır:

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

o zaman yöntemi çağırmanız gerektiğinde böyle bir şey koyun

//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()); 

4
Örnek derleme sırasında zaten biliniyorsa neden yapmıyorsunuz className.getName().toString()? Bütün düşünme noktasını kaçırıyorsunuz.
BalusC

Dediğim gibi, bu durumda gereksizdir, ancak örneğin her zaman kötü bir programlama alışkanlığı olduğunu bildiğinizi varsayarsak.
SMayne

2
@SMayne: Bu yayını silmenizi öneririm.
lpapp

kötü programlama bu durumda bir iltifat olacaktır
pdenti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.