Hi Simon,

this is true - but what happens if someone else tries to access
component attributes via reflection?

regards,

Martin

On 2/8/08, Simon Kitching <[EMAIL PROTECTED]> wrote:
>
> In the practice the problem is that jsf core (myfaces and ri) uses
> reflection to set the attributes and the following case fail:
>
> Fail with the following exception
>
> java.lang.IllegalAccessException: Class javax.faces.component._Util can not
> access a member of class org.apache.myfaces.test.AbstractComponent with
> modifiers "public"
>         at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
>         at java.lang.reflect.Method.invoke(Unknown Source)
>         at javax.faces.component._Util.getValue(_Util.java:54)
>         at javax.faces.component.BaseComponent.getValueReflection(
> BaseComponent.java:32)
>         at javax.faces.other.ComponentTest.main(ComponentTest.java:14)
>
> This behavior is a JDK bug:
>
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4071957
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4533479
>
> One possible workaround is put the following line before invoke:
>
>             readMethod.setAccessible(true);
>
> Or make AbstractComponent public.
>
> The conclusion is that the abstract base class should be public if and only
> if it has in his body a attribute definition available on the tld. If the
> abstract base class has some different code it can be package scope. This
> behavior discard this approach for myfaces core api!
>
> I'm not sure this behaviour is a bug, or that it is fatal for the purposes
> of generating base classes for myfaces-api.
>
> When a Method object refers to a public method in a package-scoped class,
> then Method.invoke fails with the above exception *when executed by some
> class outside that package*. However it succeeds fine when invoked by code
> within that package (eg its concrete subclass) or by the class itself. I
> have tested this behaviour and it is the same on both java1.6 and java1.3.
> It also seems quite reasonable behaviour.
>
> So one solution is for the generated base class to override getAttributes()
> to return a custom map where that class itself implements the fetching of
> the attributes it implements, and delegates to the map created by
> UIComponentBase.getAttributes() for anything else. This seems quite
> feasable.
>
> Regards,
> Simon
> --
> View this message in context:
> http://www.nabble.com/Re%3A--Myfaces-Wiki--Update-of-%22Code-Generation%22-by-SimonKitching-tp15216313p15353739.html
> Sent from the My Faces - Dev mailing list archive at Nabble.com.
>
>


-- 

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Reply via email to