[External] : how does one get value of ConstantValueAttribute?

Chen Liang chen.l.liang at oracle.com
Mon Nov 25 23:14:00 UTC 2024


Hi Mark,
You are calling constant() on an Optional. You should call cva.get().constant().constantValue() instead.

Chen
________________________________
From: Mark Roberts <markro at cs.washington.edu>
Sent: Monday, November 25, 2024 5:06 PM
To: Chen Liang <chen.l.liang at oracle.com>; classfile-api-dev at openjdk.org <classfile-api-dev at openjdk.org>
Subject: RE: [External] : how does one get value of ConstantValueAttribute?


Here is snippet from my source:



import java.lang.classfile.*;

import java.lang.classfile.attribute.*;

import java.lang.classfile.attribute.ConstantValueAttribute;

import java.lang.classfile.Attributes;

import java.lang.classfile.components.ClassPrinter;

import java.lang.classfile.constantpool.*;

import java.lang.classfile.instruction.*;

import java.lang.constant.*;

import java.lang.invoke.MethodHandles;

import static java.lang.classfile.constantpool.PoolEntry.*;

import static java.lang.constant.ConstantDescs.*;

.

.

.

      // get constant static fields

      List<FieldModel> fields = classModel.fields();

      for (FieldModel fm : fields) {

        Optional<ConstantValueAttribute> cva = fm.findAttribute(Attributes.constantValue());

        if (cva.isPresent()) {

          Utf8Entry utf8 = fm.fieldName();

          String value = formatConstantDesc(cva.constant().constantValue());

          System.out.printf("  Constant field: %s, value: %s%n", utf8.stringValue(), cva);

        }

      }



and here is snippet from compilation:



./daikon/chicory/Instrument.java:316: error: cannot find symbol

          String value = formatConstantDesc(cva.constant().constantValue());

                                                                               ^

  symbol:   method constant()

  location: variable cva of type Optional<ConstantValueAttribute>



Let me know if you need more info.  Thanks for the assistance.



Mark





From: Chen Liang <chen.l.liang at oracle.com<mailto:chen.l.liang at oracle.com>>
Sent: Monday, November 25, 2024 2:49 PM
To: Mark Roberts <markro at cs.washington.edu<mailto:markro at cs.washington.edu>>; classfile-api-dev at openjdk.org<mailto:classfile-api-dev at openjdk.org>
Subject: Re: [External] : how does one get value of ConstantValueAttribute?



This is an interface method, which is implicitly public.  You should be able to call it without any problem. If there is a compile error, can you share the snippet of code that you managed to reproduce an error?

________________________________

From: Mark Roberts <markro at cs.washington.edu<mailto:markro at cs.washington.edu>>
Sent: Monday, November 25, 2024 4:44 PM
To: Chen Liang <chen.l.liang at oracle.com<mailto:chen.l.liang at oracle.com>>; classfile-api-dev at openjdk.org<mailto:classfile-api-dev at openjdk.org> <classfile-api-dev at openjdk.org<mailto:classfile-api-dev at openjdk.org>>
Subject: RE: [External] : how does one get value of ConstantValueAttribute?



Sorry – typo:  ‘constant()’



From: Chen Liang <chen.l.liang at oracle.com<mailto:chen.l.liang at oracle.com>>
Sent: Monday, November 25, 2024 2:35 PM
To: Mark Roberts <markro at cs.washington.edu<mailto:markro at cs.washington.edu>>; classfile-api-dev at openjdk.org<mailto:classfile-api-dev at openjdk.org>
Subject: Re: [External] : how does one get value of ConstantValueAttribute?



Hi Mark,

I don't understand your question.  Nowhere in any document mentions there's a "const" in ConstantValueAttribute.  Its Javadoc is available here:

https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/classfile/attribute/ConstantValueAttribute.html<https://urldefense.com/v3/__https:/download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/classfile/attribute/ConstantValueAttribute.html__;!!ACWV5N9M2RV99hQ!LL2vfYLl-_GR0xLXyaydxqZog5OPnJudBuAZUaFkt9ojJHORh2WZryU1DK0bAH9EPsUz1D3nHmNwq16k4EPL2opBEg$>

So once you get a ConstantValueAttribute from a field, you can check its constant() accessor, and pattern match to check if it is an IntegerEntry/StringEntry etc.



Regards,

Chen Liang

________________________________

From: Mark Roberts <markro at cs.washington.edu<mailto:markro at cs.washington.edu>>
Sent: Monday, November 25, 2024 4:17 PM
To: Chen Liang <chen.l.liang at oracle.com<mailto:chen.l.liang at oracle.com>>; classfile-api-dev at openjdk.org<mailto:classfile-api-dev at openjdk.org> <classfile-api-dev at openjdk.org<mailto:classfile-api-dev at openjdk.org>>
Subject: [External] : how does one get value of ConstantValueAttribute?



ConstantValueAttribute:const() is not public.  The documentation implies it is.  How do you get the value?



Thanks,

Mark


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/classfile-api-dev/attachments/20241125/3dc2ab56/attachment-0001.htm>


More information about the classfile-api-dev mailing list