Java 在Android上调用方法

Java 在Android上调用方法,java,android,Java,Android,我有三个函数:getMeses()、getDias()和getHoras(),这些函数我想调用或从类似myMap.get(“meses”).invoke的映射调用它们,然后调用getMeses()函数 我试着用黑客反射一个 但当执行*.invoke方法时,会出现一个错误: 02-20 13:36:01.153 27778-27778/com.urbanclouds.finntime E/AndroidRuntime: FATAL EXCEPTION: main Process: com.urba

我有三个函数:getMeses()、getDias()和getHoras(),这些函数我想调用或从类似myMap.get(“meses”).invoke的映射调用它们,然后调用getMeses()函数

我试着用黑客反射一个

但当执行*.invoke方法时,会出现一个错误:

02-20 13:36:01.153 27778-27778/com.urbanclouds.finntime E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.urbanclouds.finntime, PID: 27778
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.urbanclouds.finntime/com.urbanclouds.finntime.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[])' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2543)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2609)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1465)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5683)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[])' on a null object reference
at com.urbanclouds.finntime.MainActivity.onCreate(MainActivity.java:39)
at android.app.Activity.performCreate(Activity.java:6270)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2609) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1465) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5683) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
这个方法不能在Android上使用吗?如果没有,我怎么做我想做的

这是我的实际代码:

String time_data_keys[] = {"meses", "dias", "horas"};
HashMap<String, TextView> time_data;

@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    int id;

    time_data = new HashMap<>();

    for ( String key : time_data_keys) {
        id =  getResources().getIdentifier(key,"id",getApplication().getPackageName());
        time_data.put(key, (TextView) findViewById(id));
    }

    Map<String, Method> methodMap = new HashMap<>();

    try {
        methodMap.put("meses", MainActivity.class.getMethod("getMeses"));
        //methodMap.put("dias", MainActivity.class.getMethod("getDias"));
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    }
/*
    try {
        methodMap.get("meses").invoke(null);
    } catch (IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
    }
*/
    time_data.get("meses").setText(getMeses());
    //time_data.get("dias").setText(getDias());
    //time_data.get("horas").setText("Horas: %128:%32:%17");
}

private String getMeses() {

    // some stuff
    int num_meses = 2;
    String meses = String.valueOf(num_meses);

    Log.i("getMeses()", "He conseguido entrar!!");

    return getResources().getString(getResources().getIdentifier("meses","string",getApplication().getPackageName()))
            .replace("%m",meses);
}
字符串时间数据键[]={“meses”、“dias”、“horas”};
HashMap时间数据;
@TargetApi(Build.VERSION\u code.KITKAT)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int-id;
time_data=new HashMap();
for(字符串键:时间\数据\键){
id=getResources().getIdentifier(键“id”,getApplication().getPackageName());
time_data.put(key,(TextView)findViewById(id));
}
Map methodMap=newhashmap();
试一试{
methodMap.put(“meses”,MainActivity.class.getMethod(“getMeses”);
//methodMap.put(“dias”,MainActivity.class.getMethod(“getDias”);
}捕获(无此方法例外){
e、 printStackTrace();
}
/*
试一试{
methodMap.get(“meses”).invoke(null);
}捕获(IllegalAccessException | InvocationTargetException e){
e、 printStackTrace();
}
*/
time_data.get(“meses”).setText(getMeses());
//time_data.get(“dias”).setText(getDias());
//time_data.get(“horas”).setText(“horas:%128:%32:%17”);
}
私有字符串getMeses(){
//一些东西
int num_meses=2;
String meses=String.valueOf(num_meses);
Log.i(“getMeses()”,“He conseguido entra!!”;
返回getResources().getString(getResources().getIdentifier(“meses”,“string”,getApplication().getPackageName()))
.替换(“%m”,meses);
}

编辑:使用此选项而不是null将获得相同的结果

好的,感谢Selvin我创建了一个新对象,然后我可以做我想做的事情:

private class MisMetodos {

    public String getMeses() {

        // some stuff
        int num_meses = 2;
        String meses = String.valueOf(num_meses);

        Log.i("getMeses()", "He conseguido entrar!!");

        return getResources().getString(getResources().getIdentifier("meses","string",getApplication().getPackageName()))
                .replace("%m",meses);
    }

    public String getDias() {
        // some stuff
        int num_dias = 32;
        String dias = String.valueOf(num_dias);

        return getResources().getString(getResources().getIdentifier("dias","string",getApplication().getPackageName()))
                .replace("%m",dias);
    }
}
并以这种方式使用反射:

MisMetodos metodos = new MisMetodos();

try {
    methodMap.put("meses", MisMetodos.class.getMethod("getMeses"));
    //methodMap.put("dias", MainActivity.class.getMethod("getDias"));
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

try {
    methodMap.get("meses").invoke(metodos);
} catch (IllegalAccessException | InvocationTargetException e) {
    e.printStackTrace();
}

我认为您正在寻找
methodMap.get(“meses”).invoke(this)-调用需要一个对象参数。如果方法是
static
,则只能传递
null
。使用null调用用于静态方法。。。在另一种情况下,您需要从中调用此方法的对象…所以我需要创建一个对象,以便以这种方式调用该函数?使用它而不是null获取已经为null的指针异常Kenney问题不在于什么是null指针,而在于它为什么在我的项目中生成。