java反射使用setAccessible(true)调用private方法问题

如题,定义了一个Person类有一个private方法
publicPerson{
privatevoidtest();//private方法
}
使用反射来调用先说有问题的方法
Constructorcon=Person.class.getConstructor();//构造方法
Objectobject=con.newInstance();//生成对象
//有问题
Person.class.getDeclareMethod("test").setAccessible(true);
Person.class.getDeclareMethod("test").invoke(object);//报错不能访问
/*Person.class.getDeclareMethod("test").isAccessible()还是等于false*/
而使用下面的写法却可以
Method=Person.class.getDeclareMethod("test");
method.setAccessible(true);
method.invoke(object);//不报错,正常执行
/*method.isAccessible()是true
而Person.class.getDeclareMethod("test").isAccessible()还是等于false
*/
这是Person.class.getDeclareMethod("test")方法的问题吗,这个问题在反射调用构造函数时也会出现,他们都有一个@CallerSensitive注解,是这个原因吗?望解答。
隔江千里
浏览 1940回答 2
2回答

白衣染霜花

每次获取方法得到不是同一个Method对象setAccessable仅作用于得到的方法对象,也不是全局的所以第一种写法会报错另外,setAccessable的属性并没有被包含在Method的equals和hashCode中

料青山看我应如是

@CallerSensitivepublicMethodgetDeclaredMethod(Stringname,Class...parameterTypes)throwsNoSuchMethodException,SecurityException{checkMemberAccess(Member.DECLARED,Reflection.getCallerClass(),true);Methodmethod=searchMethods(privateGetDeclaredMethods(false),name,parameterTypes);if(method==null){thrownewNoSuchMethodException(getName()+"."+name+argumentTypesToString(parameterTypes));}returnmethod;}privatestaticMethodsearchMethods(Method[]methods,Stringname,Class[]parameterTypes){Methodres=null;StringinternedName=name.intern();for(inti=0;i
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript