[
https://issues.apache.org/jira/browse/BEANUTILS-340?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Niall Pemberton updated BEANUTILS-340:
--------------------------------------
Fix Version/s: LATER THAN 1.8.1
Currently BeanUtils is targetted at JDK 1.3 - so I think this needs to be
looked at if/when beanutils moves to 1.5
> Property with getter from generic interface returns wrong
> readMethod/propertyType on Linux environment
> ------------------------------------------------------------------------------------------------------
>
> Key: BEANUTILS-340
> URL: https://issues.apache.org/jira/browse/BEANUTILS-340
> Project: Commons BeanUtils
> Issue Type: Bug
> Components: Bean / Property Utils
> Affects Versions: 1.8.0-BETA
> Environment: ==Works correctly in==
> Windows XP
> java version "1.5.0_12"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04)
> Java HotSpot(TM) Client VM (build 1.5.0_12-b04, mixed mode)
> ==Fails in==
> Linux 2.6.27-gentoo-r8 #6 SMP Thu Feb 5 19:18:16 MST 2009 i686 06/17
> GenuineIntel GNU/Linux
> java version "1.5.0_17"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_17-b04)
> Java HotSpot(TM) Server VM (build 1.5.0_17-b04, mixed mode)
> Reporter: Dave Lindquist
> Priority: Minor
> Fix For: LATER THAN 1.8.1
>
>
> PropertyUtils.getPropertyDescriptors is returning the wrong readMethod (and
> thus the wrong property type) when a method is implemented from a genericized
> interface, but only on some environments. This seems to work on Windows, but
> fails on Linux. (Compile environment does not matter, runtime environment
> does seem to matter.)
> Take the following test class:
> {code}
> public class Testing
> {
> public static void main(String[] args) throws Exception
> {
> for(PropertyDescriptor desc :
> PropertyUtils.getPropertyDescriptors(Test2.class))
> {
> if(desc.getName().equals("something"))
> {
> System.out.println(desc.getName() + "\t" +
> desc.getPropertyType() + "\t" + desc.getReadMethod() + "\t" +
> desc.getReadMethod().isSynthetic() + "\t" + desc.getReadMethod().isBridge());
> }
> }
> }
>
> // An interface with generics, and with getter and setter defined
> 'generically'.
> public static interface Test<T extends Number>
> {
> public T getSomething();
>
> public void setSomething(T something);
> }
>
> // A concrete class using a specific genericization of the interface
> (Long), with getter and setter implemented appropriately.
> public static class Test2 implements Test<Long>
> {
> public Long getSomething()
> {
> return(null);
> }
>
> public void setSomething(Long something)
> {
>
> }
> }
> }
> {code}
> When run on Windows XP, and working correctly, this prints:
> something class java.lang.Long public java.lang.Long
> Testing$Test2.getSomething() false false
> indicating that it got the 'long' version of the method, and that this method
> is NOT synthetic or a bridge method.
> However, when run on Linux, this prints:
> something class java.lang.Number public volatile java.lang.Number
> Testing$Test2.getSomething() true true
> which is the signature from the interface, and is marked with both synthetic
> and bridge, indicating that this is not the 'real' method, but the
> compiler-created method due to generics.
> I think that it should be ignoring the 'synthetic/bridge' method auto-created
> by the compiler, but I'm not sure why it is environment-dependent. Perhaps
> the environment somehow controls the method definition order? (At runtime,
> not compile time, obviously.)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.