Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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_Reflection_Singleton_Field - Fatal编程技术网

Java反射中的字段类可以在任何对象上工作吗?

Java反射中的字段类可以在任何对象上工作吗?,java,reflection,singleton,field,Java,Reflection,Singleton,Field,我很好奇是否可以存储一个Field对象的实例,并在传递给它的任何对象上使用它。我正在做大量的反射工作,我记得在某个地方读到,存储一个Field对象并将其作为单例(或多或少)使用以从类快速访问该字段是不安全的 这真的有可能吗,或者我正在尝试做的事情是危险的还是有缺陷的?我做了一个快速测试来检查,它似乎起作用了。。。但我不确定单凭这个测试是否就能证明这一点 这假定允许我们访问该字段,并且不会引发SecurityException 用于测试的代码: package test; import jav

我很好奇是否可以存储一个Field对象的实例,并在传递给它的任何对象上使用它。我正在做大量的反射工作,我记得在某个地方读到,存储一个Field对象并将其作为单例(或多或少)使用以从类快速访问该字段是不安全的

这真的有可能吗,或者我正在尝试做的事情是危险的还是有缺陷的?我做了一个快速测试来检查,它似乎起作用了。。。但我不确定单凭这个测试是否就能证明这一点

这假定允许我们访问该字段,并且不会引发SecurityException


用于测试的代码:

package test;

import java.lang.reflect.Field;

public class TestClass {

    public static void main(String[] args) {
        Field fa = null;
        Field fb = null;

        for (Field f : Test.class.getDeclaredFields()) {
            switch (f.getName()) {
            case "a":
                fa = f;
                break;
            case "b":
                fb = f;
                break;
            }
        }

        fa.setAccessible(true);
        fb.setAccessible(true);

        Test ta = new Test(5, "test");      
        Test tb = new Test(54, "new string");

        try {
            System.out.println(fa.get(ta) + " " + fa.get(tb) + " " + fb.get(ta) + " " + fb.get(tb));
        } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

@SuppressWarnings("unused")
class Test {

    private int a;
    private String b;

    public Test(int a, String b) {
        this.a = a;
        this.b = b;
    }
}
收益率:

5 54 test new string

这很好,应该是这样的。
字段
指的是特定中的字段,而不是该类的特定实例(对象)——因此您可以将其用于该类的任何实例

当然,如果
字段
引用类
测试
中的字段,则只能在类型为
测试
的对象上使用它。如果您试图在
字段上调用
get(Object o)
IllegalArgumentException
传递给它的不是
Test
对象的内容,则会得到
IllegalArgumentException


请参阅的API文档。

这很好,应该是这样工作的。
字段
指的是特定中的字段,而不是该类的特定实例(对象)——因此您可以将其用于该类的任何实例

当然,如果
字段
引用类
测试
中的字段,则只能在类型为
测试
的对象上使用它。如果您试图在
字段上调用
get(Object o)
IllegalArgumentException
传递给它的不是
Test
对象的内容,则会得到
IllegalArgumentException


请参阅的API文档。

这很好,应该是这样工作的。
字段
指的是特定中的字段,而不是该类的特定实例(对象)——因此您可以将其用于该类的任何实例

当然,如果
字段
引用类
测试
中的字段,则只能在类型为
测试
的对象上使用它。如果您试图在
字段上调用
get(Object o)
IllegalArgumentException
传递给它的不是
Test
对象的内容,则会得到
IllegalArgumentException


请参阅的API文档。

这很好,应该是这样工作的。
字段
指的是特定中的字段,而不是该类的特定实例(对象)——因此您可以将其用于该类的任何实例

当然,如果
字段
引用类
测试
中的字段,则只能在类型为
测试
的对象上使用它。如果您试图在
字段上调用
get(Object o)
IllegalArgumentException
传递给它的不是
Test
对象的内容,则会得到
IllegalArgumentException


请参阅的API文档。

使用反射,您几乎可以做任何事情,还可以从对象外部设置私有变量或调用私有方法。
在运行时,这不会被选中。就我所知,这是编译器的关键字(这一点我可能错了,请纠正我)。

通过反射,您可以做几乎任何事情,还可以设置私有变量或从对象外部调用私有方法。
在运行时,这不会被选中。就我所知,这是编译器的关键字(这一点我可能错了,请纠正我)。

通过反射,您可以做几乎任何事情,还可以设置私有变量或从对象外部调用私有方法。
在运行时,这不会被选中。就我所知,这是编译器的关键字(这一点我可能错了,请纠正我)。

通过反射,您可以做几乎任何事情,还可以设置私有变量或从对象外部调用私有方法。
在运行时,这不会被选中。仅就我所知,这是编译器的关键字(这一点我可能错了,请纠正我)。

另一个选项是使用
MethodHandle
而不是反射。我记得在阅读时,将字段对象存储为单例是不安全的。你能找到来源吗?我从来没有听过这样的话,我认为这是没有原因的。不要调用
setAccessible(true)
并公开
字段。大多数库等都使用缓存,例如,该字段与从中获取该字段的类具有相同的生存期。@Radiodef我也在寻找它,因为我记得在StackOverflow某处读过它,认为它是一个肯定的/可接受的答案。可能是方法上的,我不确定。我将再次搜索,看看它是否能找到它——如果能找到,我将发布它。另一个选择是使用
MethodHandle
而不是反射。我记得读过一篇文章时,将字段对象存储为单例是不安全的。你能找到来源吗?我从来没有听过这样的话,我认为这是没有原因的。不要调用
setAccessible(true)
并公开
字段。大多数库等都使用缓存,例如,该字段与从中获取该字段的类具有相同的生存期。@Radiodef我也在寻找它,因为我记得在StackOverflow某处读过它,认为它是一个肯定的/可接受的答案。可能是方法上的,我不确定。我将再次搜索,看看它是否能找到它——如果能找到,我将发布它。另一个选择是使用
MethodHandle
而不是反射。我记得读过一篇文章时,将字段对象存储为单例是不安全的。你能找到来源吗?我从来没有听过这样的话,我认为这是没有原因的。不要打电话给se