Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过上下文传递类名,并使用它在不同的类中存储静态值_Java_Class_Methods_Static_Closures - Fatal编程技术网

Java 通过上下文传递类名,并使用它在不同的类中存储静态值

Java 通过上下文传递类名,并使用它在不同的类中存储静态值,java,class,methods,static,closures,Java,Class,Methods,Static,Closures,对话框和数组显示得很好,我只想能够在onClick中设置来自原始类的静态变量,该类位于不同类的方法中。所有的尝试,捕获和 是我在编译器的坚持下输入的内容: public class Setter { public void myList(Context context, Class<?> thisclass, int arrayid, String choice) { return new AlertDialog.Builder(con

对话框和数组显示得很好,我只想能够在
onClick
中设置来自原始类的静态变量,该类位于不同类的方法中。所有的
尝试
捕获
是我在编译器的坚持下输入的内容:

public class Setter
    {
    public void myList(Context context, Class<?> thisclass, int arrayid, String choice)
        {
        return new AlertDialog.Builder(context)
        .setItems(arrayid, new OnClickListener()
            {
            @Override
            public void onClick(DialogInterface dialog, int which)
                {
                setChoice(thisclass, context, arrayid, which, choice);
                }
            })
        .create();
        }           
    public void setChoice(Class<?> thisclass, Context context, int arrayid, int which, String choice)
        {
        String[] array = context.getResources().getStringArray(arrayid);
        try
            {
            Field f = thisclass.getDeclaredField(choice);
            f.set(null, array[which]);
            }
        catch (SecurityException e)
            {
            e.printStackTrace();
            }
        catch (NoSuchFieldException e)
            {
            e.printStackTrace();
            }
        catch (IllegalArgumentException e)
            {
            e.printStackTrace();
            }
        catch (IllegalAccessException e)
            {
            e.printStackTrace();
            }
        }
    }

public class ClassA extends Activity
    {
    static String stringa;
    Setter setted = new Setter();
    ...
    public void onCreate()
        {
        super.onCreate();
        ...
        AlertDialog thinga = setted.myList(this, getclass(), R.array.thinga, stringa).show();
        ...
        }
    }
我想我把它传错了,但这有点超出了我目前的深度

我有许多不同的类,每个类都有自己的
静态字符串。我正在传递
字符串
(在
选项
)名称下面的方法,我希望的是调用方法的原始类的
上下文
,该方法调用了导致下面代码的方法。我希望我能调用
context.choice=something
,机器会把它读作
ClassA.stringa=something我该怎么做

简单地说,我希望有一个项目列表,用户可以从中选择对话的内容,并将它们的选择保存起来,供调用创建对话的类访问。也许我在这个问题上完全错了,但我已经厌倦了处理涉及使用微调器来做同样事情的其他“麻烦事”

因为
onClick
不能在其他地方声明非final对象(至少我的理解是这样),所以我想我可以通过调用另一个方法
setChoice
来解决这个问题,该方法将存储所选内容的值。我可以肯定地说,这是一个难题,我很想让大家知道你应该如何处理这些事情。

简短的回答-使用

答案很长-您需要获得所需上下文
的访问权限。一旦获得对字段实例的访问权,就可以使用该方法设置其值;API调用有点棘手,因为您需要传入要修改其字段的对象引用(上下文对象而不是上下文类)


方法的
上下文
选项
某物
参数必须包含使此操作尽可能简单的必要信息。换句话说,上下文类可能必须包含包含字段的实际
对象(或提供获取一个对象的方法)。

您可以使用反射。假设您的上下文是类本身

public void setChoice(Class<?> context, String choice, String something)
{
   try {
     Field f = context.getDeclaredField(choice);
     f.set(null, something);
   } catch (....) {
   }
}
public void setChoice(类上下文、字符串选择、字符串某物)
{
试一试{
字段f=context.getDeclaredField(选项);
f、 设置(空,某物);
}捕获(……){
}
}
添加适当的异常处理



请注意,
set
的第一个参数为null。这仅对静态方法有效。因此,您可能希望使用
f.getModifiers()

检查方法是否是静态的。Java没有闭包,但您可以使用匿名内部类来接近它

String output;
public void onCreate() {
    Setter.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            output  = "selected";
        }
    });
}
另请参见本swing教程:

编辑: 按照您的示例精神,这应该如下所示:

public class Setter
{
public void setChoice(IsetString setter, String something)
    {
    setter.setString(something);
    }
}


class ClassA extends Activity implements setString
{
static String stringa;
string polka = "dots";
Setter setted = new Setter();
...
public void onCreate()
    {
    super.onCreate();
    ...
    setted.setChoice(new IsetString() {

        @Override
        public void setString(String s) {
            stringa = s;
        }
    }, polka);
    ...
    }
}

interface IsetString {
    void setString(String s);
}

对我来说,你的代码有一种奇怪的味道,看起来可能是一个乱七八糟的东西。为什么不使用OOP技术,创建一个接口,并使用多态性的强大功能调用适当的接口方法呢?还有,为什么是静态变量?@Hovercraft,事实上他正在调用的方法中设置调用者的变量,这比气味更糟糕<代码>字符串a=波尔卡
就足够了,而不是
setted.setChoice(this,stringa,polka)。不知怎的,他想把一个任务陈述抽象出来。@Hovercraft,我在这里见过的最好的名字。你可能是完全正确的,我希望有人会把它作为答案之一,如果不是的话,我必须仔细阅读接口@维尼埃,我说这是一个极端的简化。我已经更新了问题的底部,说明了我通常要做的事情以及我试图使用此特定代码的目的。您可能想说明为什么call
f.set(null,某物)中的第一个arg为空。对于实例成员,这将导致NullPointerException。您的解决方案似乎是最简单的解决方案,但当我尝试传递
对象时,我收到以下消息:“类是原始类型。对泛型类型类的引用应参数化”,唯一的建议是“推断泛型类型参数”或“添加抑制警告”我可以获得更多帮助吗?
应该可以工作。在任何情况下,它只是一个警告,不会停止编译。我更新了这方面的答案。hrm好的,这似乎是我在问题中尝试做的(我更新它以反映我添加的代码,以尝试实现您的建议)可能是我把类搞错了吗?现在我不明白你的问题是什么。如果你遇到了一些编译器错误/警告,请弄清楚它们。只需在问题中添加编译器输出。hrm我下班后会进一步研究这个问题,我可能已经浏览了关于接口的一章……我仍然不完全清楚这个答案的作用我,请原谅我的无知。另外,看上面的编辑,我认为我现在要做的事情要明显得多。我根本不明白你想做什么。基本上,你想用反射来做一些不应该用反射来做的事情。而且,你的问题被一个半生不熟的尝试所污染,以至于我无法理解甚至不能再过滤出真正的问题。你使用
上下文
我不明白,因为你将
ClassA extends Activity
传递到上下文中,你从上下文中也得到了一个数组,但上下文中没有。我想你想为某个变量设置一个特定的值,但我不知道它从哪里来,应该去哪里。我不能在黑暗中尝试使用
字段
…结果与您所期望的非常接近。请参阅编辑。
public class Setter
{
public void setChoice(IsetString setter, String something)
    {
    setter.setString(something);
    }
}


class ClassA extends Activity implements setString
{
static String stringa;
string polka = "dots";
Setter setted = new Setter();
...
public void onCreate()
    {
    super.onCreate();
    ...
    setted.setChoice(new IsetString() {

        @Override
        public void setString(String s) {
            stringa = s;
        }
    }, polka);
    ...
    }
}

interface IsetString {
    void setString(String s);
}