RFR 8129215: com.sun.jmx.mbeanserver.Introspector may provide results inconsistent with the JavaBeans Introspector
Jaroslav Bachorik
jaroslav.bachorik at oracle.com
Fri Jun 19 09:56:19 UTC 2015
On 19.6.2015 00:02, Daniel Fuchs wrote:
> On 6/18/15 7:16 PM, Jaroslav Bachorik wrote:
>> On 18.6.2015 18:47, Daniel Fuchs wrote:
>>> Hi Jaroslav,
>>>
>>> I haven't looked at the code, but if I understand well,
>>> that would be a spec change.
>>>
>>> Attribute names are case sensitive in JMX.
>>>
>>> getFoo() => attribute named "Foo"
>>> getfoo() => attribute named "foo"
>>>
>>> Are you proposing to change that?
>>
>> In this case it is an even bigger mess. This would work as long as you
>> don't go through the JavaBeans introspector. The property descriptor
>> generated for the "getFoo" method will be named "foo" and it is
>> indistinguishable from "getfoo". Therefore, when you are trying to
>> reach this attribute as "Foo" the JavaBeans introspector will not
>> resolve the getter name. The SimpleIntrospector, on the other hand, will.
>>
>> I am proposing to change the SimpleIntrospector so it behaves exactly
>> as the JavaBeans introspector. But it seems that even that might be
>> considered a specification change :/
> In the JMX 1.4 specification - section 2.2.2.3:
>
> https://docs.oracle.com/javase/8/docs/technotes/guides/jmx/JMX_1_4_specification.pdf
>
> <<
> 2.2.2.3 Case Sensitivity
>
> All attribute and operation names derived from these design patterns are
> case-
> sensitive. For example, this means that the methods 'getstate' and
> 'setState'
> define two attributes, one called 'state' that is read-only, and one called
> 'State' that is write-only.
>
> While case sensitivity applies directly to component names of standard
> MBeans, it is
> also applicable to all component names of all types of MBeans, standard
> or dynamic.
> In general, all names of classes, attributes, operations, methods, and
> internal
> elements defined in the JMX specification are case sensitive, whether
> they appear as
> data or as functional code when they are manipulated by management
> operations.
> >>
I know, I checked the spec. The problem is that the JavaBeans
Introspector, which may get used internally in the JMX code, doesn't
follow this spec.
Try this code:
```
public static class BeanClass1 {
public int getAttribute() {return 0;}
public int getattribute() {return 1;}
}
public static class BeanClass2 {
public int getAttribute() {return 0;}
}
public static void main(String[] args) throws Exception {
System.err.println("=== BeanClass1");
printInfo(Introspector.getBeanInfo(BeanClass1.class));
System.err.println("=== BeanClass2");
printInfo(Introspector.getBeanInfo(BeanClass2.class));
}
private static void printInfo(BeanInfo bi) {
for(PropertyDescriptor pd : bi.getPropertyDescriptors()) {
System.err.println("*** " + pd.getName() + " : " +
pd.getReadMethod().getName());
}
}
```
According to the JMX spec there should be 2 attributes: 'attribute' and
'Attribute'
However, there is only one attribute resolved by the JavaBeans
Introspector and it is 'attribute'. Furthermore, the 'getattribute'
method is chosen as the getter method, rather counter-intuitively.
Anyway, this specification aspect doesn't seem to be enforced neither by
the JTREG test suite nor the JCK tests. I successfully ran jdk_jmx JTREG
testset and api/javax_management JCK suite on my patched version of JDK.
-JB-
>
> -- daniel
>
>>
>> -JB-
>>
>>>
>>> best regards,
>>>
>>> -- daniel
>>>
>>> On 18/06/15 18:39, Jaroslav Bachorik wrote:
>>>> Please, review the following change
>>>>
>>>> Issue : https://bugs.openjdk.java.net/browse/JDK-8129215
>>>> Webrev: http://cr.openjdk.java.net/~jbachorik/8129215/webrev.00
>>>>
>>>> The JMX Introspector will try to use the JavaBeans introspector
>>>> whenever
>>>> possible, delegating the requests for the property getter/setter
>>>> methods. However, when the JavaBeans introspector is not available
>>>> (modules) the JMX Introspector falls back to its own simple, reflection
>>>> based, algorithm.
>>>>
>>>> The simple algorithm does not enforce the rule of property names
>>>> starting with a lower-case letter. This might lead to situations when
>>>> the simple introspector provides the getter method for an attribute the
>>>> JavaBeans introspector would not (eg. 'Attribute' attribute)
>>>>
>>>> This patch changes the simple introspector behaviour to conform to the
>>>> one of the JavaBeans introspector. Also, it makes the simple
>>>> introspector called only when the JavaBeans introspector is not
>>>> available - and not when the JavaBeans introspector fails to resolve a
>>>> property getter.
>>>>
>>>> Thanks,
>>>>
>>>> -JB-
>>>
>>
>
More information about the serviceability-dev
mailing list