当前位置: 首页 > 知识库问答 >
问题:

如何通过字段名获取字段的值?[副本]

轩辕海
2023-03-14

我试图制作一个方法,获取封闭实例中的任何字段,对于一对2D坐标(其字段名以“X”结尾)的任何“X”组件具有整数值。

    public int getX(String object) throws NullPointerException{
        String objectX = object + "X";
        Component c = null;
        try{
        Integer x = new Integer(object);
        x = c.getX();
        if(object != null){
            return x;
        }
        }catch (NullPointerException e){} // if the referenced object does not exist.
        System.err.println("The object "+object+"does not exist or the name was spelled incorrectly.");
        return (Integer)null;
    }

但我在编译器中得到的只是:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input     string: "append"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.<init>(Unknown Source)
    at PlazmaBurst2.Body.getX(Body.java:118)
    at PlazmaBurst2.Body.append(Body.java:79)
    at PlazmaBurst2.Body.<init>(Body.java:53)
    at PlazmaBurst2.PB2Main$DrawingCanvas.paintComponent(PB2Main.java:40)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at javax.swing.JLayeredPane.paint(Unknown Source)
    at javax.swing.JComponent.paintChildren(Unknown Source)
    at javax.swing.JComponent.paintToOffscreen(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
    at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
    at javax.swing.RepaintManager.paint(Unknown Source)
    at javax.swing.JComponent.paint(Unknown Source)
    at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
    at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
    at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
    at java.awt.Container.paint(Unknown Source)
    at java.awt.Window.paint(Unknown Source)
    at javax.swing.RepaintManager$3.run(Unknown Source)
    at javax.swing.RepaintManager$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
    at javax.swing.RepaintManager.access$1000(Unknown Source)
    at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)    

方法将这样使用:

Image img = setImage("myImage.png");
int imgX = getX(img);// use of getX(String)

我做错了什么?

共有3个答案

段干长恨
2023-03-14

似乎您正在将该类中对象的X值的值存储为字段,并且您正试图创建一个查询该对象的X值的方法。

问题在于,您正在将对象的标识符传递给getX(String),而实际上它需要一个字符串(字段的名称?)。如果要获取字段值,可以使用反射按名称获取字段值:

public int getX(String object) {
    try {
        return Plasmaburst2.Body.class.getDeclaredField(object + "X");
    } catch(NoSuchFieldException | SecurityException e) {
        return 0;
    }
}

但是,出于性能原因,可以考虑使用哈希映射而不是反射,或者只为自己的类存储对象的坐标。

慕高格
2023-03-14

也许问题出在物体上!它是一个包含整数的字符串。尝试运行捕获NumberFormatException的代码

  public int getX(String object) throws NullPointerException{
    String objectX = object + "X";
    Component c = null;
    try{
        try{
            Integer x = new Integer(object);
        } catch(NumberFormatException ex){
            System.out.println("You were trying to convert <" + object "> to Integer but it's impossible");
        }

        // The above line c was initiated to null so I delete this line for thest x = c.getX();
        x = (int)(Math.random() * 100) ;
        if(object != null){
            return x;
        }
    }catch (NullPointerException e){} // if the referenced object does not exist.

    System.err.println("The object "+object+"does not exist or the name was spelled incorrectly.");
    return (Integer)null;
}
厍晋鹏
2023-03-14

您似乎认为将对象传递给字符串参数就像参数传递对象的标识符一样。

换句话说,如果你这样做:

public static void printObject(String ostring) {
    System.out.println(ostring);
}

Object object = new Object();
printObject(object);

然后,您认为这将打印“object”,而实际上,您的IDE会给您一个警告,因为它不可编译,或者(可能)静默地更改代码以调用对象的toString方法。

你想要这样做的方式可能是通过一些被黑客攻击的反射来获得任何对象的场”...X"但不要那样做。它被黑了。

相反,如果你真的想做一些像这样的“通用”的事情,你可以使用你的类实现的接口。接口是为这类事情设计的。

// not to be confused with java.awt.Point
public interface Point {
    public Point getPoint();
    public int getX();
    public int getY();
}

任何类都可以实现接口,方法返回的内容取决于该实现。您可以对实现的任何类调用getX,由该类决定要采取的适当操作。接口的实现类型也是不可知的。

// redundant but shows the point
public static int getXFromPoint(Point pt) {
    return pt.getX();
}

class PointImplementation implements Point {
    private Component c = somewhereElse.getAComponent();

    @Override public int getX() {
        return c.getX();
    }
    @Override public int getY() {
        return c.getY();
    }
    @Override public Point getPoint() {
        return c.getLocation();
    }
}

System.out.println(getXFromPoint(new PointImplementation()));

不确定您实际上想要从映像返回什么(java.awt.Image?)。为什么不直接调用适当的方法呢?

如果您真的希望以您想要的方式(从字符串访问字段?)执行此操作,Java反射教程介绍了以下内容:http://docs.oracle.com/javase/tutorial/reflect/member/field.html

 类似资料:
  • 我有一个方法,它返回字符串类型的字段对象列表。 这个方法应该将所有字符串字段都大写: 问题是:"field.set(...)"不起作用。它应该将值大写并将其设置为该字段的新值,但它不起作用...我如何解决这个问题的任何想法?(PS:在真正的代码中,"something Class.class"被设置为真正的类名...) 正在生成的错误是field.get(this)方法(insdefield.se

  • 问题内容: 我有一个方法: 当运行时,我得到如下输出: 现在我该怎样提取实际字符串值入, 使用反射? 问题答案: 看起来您需要引用该类的实例。您可能要调用get和pass的引用,将返回值转换为String。 您可以使用get,如下所示:

  • 问题内容: 我创建了一个简单的注释类: 我在像这样的一些类中使用它: 我知道我可以遍历声明的字段并获得如下注释: 如何在不迭代类的声明字段的情况下直接通过带注释的名称获取字段? 问题答案: 如果需要进行多次访问,则可以预处理注释。

  • 问题内容: 在Java中能否从实际字段中获取字符串中的字段名称?喜欢: PS:我 不是 在寻找字段的类/类名,也不是从String中的名称获取Field。 编辑:当我查看它时,我可能不需要一种获取字段名称的方法,该Field实例(来自字段的“代码名称”)就足够了。[例如] Java本身可能没有想要的东西。我将看一下ASM库,但最后我可能最终会使用字符串作为字段的标识符:/ EDIT2:我的英语不好

  • 问题内容: 我在Java中有一个对象(基本上是VO),但不知道其类型。 我需要获取在该对象中不为null的值。 如何才能做到这一点? 问题答案: 你可以用来获取该类的所有声明的字段。你可以用来获取价值。 简而言之: 要了解有关反射的更多信息,请查看有关该主题的Sun教程。 就是说,这些字段不一定全部代表VO的属性。你希望确定以或开头的公共方法,然后调用它以获取真实属性值。 也就是说,可能会有更优雅

  • 问题内容: 我在JPA中更新对象时遇到问题 我有豆子用户 和 当尝试更新时给我异常:当表评级包含行时,无法通过反射获得字段值 错误TransactionInterceptor:434-应用程序异常被提交异常com.vodafone.visradio.dataaccess.exception.DataAccessException覆盖:org.hibernate.PropertyAccessExce