Re: Reflection problem - isAccessible
Re: Reflection problem - isAccessible
- Subject: Re: Reflection problem - isAccessible
- From: John Huss <email@hidden>
- Date: Tue, 4 Jan 2011 11:32:55 -0600
No, it seems the accessible value isn't persistent -- a subsequent call to getDeclaredMethods will return an object without the flag set. But I can hack on WO to fix it. Maybe this could go into Wonder?
// In Application's constructor
try {
Field field = WOWSDDRegistrar.class.getDeclaredField("_instance");
field.setAccessible(true);
field.set(WOWSDDRegistrar.class, new FixedWOWSDDRegistrar());
} catch (Exception e) {
log.error("Unable to patch WOWSDDRegistrar: " + e.getMessage());
}
// New class
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import com.webobjects.appserver.WOWSDDRegistrar;
public class FixedWOWSDDRegistrar extends WOWSDDRegistrar {
protected List<String> getDeclaredMethodsForClass(Class<?> clazz) {
List<String> result = new ArrayList<String>();
for (Method method : clazz.getDeclaredMethods()) {
if (Modifier.isPublic(method.getModifiers()) && Modifier.isStatic(method.getModifiers())) {
result.add(method.getName());
}
}
return result;
}}
}
On Tue, Jan 4, 2011 at 11:12 AM, Mike Schrag
<email@hidden> wrote:
if you Main.class.getMethod("yourMethod").setAccessible(true)
it will probably work
On Jan 4, 2011, at 12:11 PM, John Huss wrote:
Ok, so it's use in WOWSDDRegistrar.getDeclaredMethodsForClass is incorrect then, and that's why I can't create a Document style web service. I love WO 5.4! I'll file a radar.
Thanks,
John
On Tue, Jan 4, 2011 at 11:03 AM, Mike Schrag
<email@hidden> wrote:
I don't think that means what you think it does ... isAccessible only returns true if you setAccessible, which tells the VM to skip VM security checks when you call the method.
You might want Modifier.isPublic(method.getModifiers()) ?
ms
On Jan 4, 2011, at 11:58 AM, John Huss wrote:
Does anyone know why this code doesn't print anything?
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
for (Method method : Main.class.getDeclaredMethods()) {
if (method.isAccessible()) {
System.out.println(method.getName());
}
}
}
}
I would expect it to print "main" since there is one public method named "main" in class Main. Isn't that what isAccessible does?
John
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden