java反射访问私有方法的的问题

LeverageUtillv=newLeverageUtil();Classa=lv.getClass();Methodb=a.getDeclaredMethod("is... LeverageUtil lv =new LeverageUtil();
Class a = lv.getClass();
Method b = a.getDeclaredMethod("isPoXlfICE", new Class[]{boolean.class});
b.setAccessible(true);
b.invoke(a.newInstance(),new Object[]{null});
这是我写的反射机制访问另一个类的私有方法的代码,代码本身没问题,但在用的时候老是提示The method b is undefined for the type Class,method是private static boolean类型
展开
 我来答
许诗文00
推荐于2017-09-19 · TA获得超过4290个赞
知道小有建树答主
回答量:425
采纳率:100%
帮助的人:26.4万
展开全部
java的反射可以绕过访问权限,访问到类的私有方法和成员。可能这点会引起安全性的讨论。反射的使用帮助解决很多复杂的问题,其运行时的类型检查,动态调用,代理的实现等,反射为我们写程序带来了很大的灵活性,很多功能都是基于反射。
利用反射还可以访问内部类、匿名内部类的私有属性。
用java自带的java -private 类名 反编译命令可以查看类的完整定义。(参考think in java)
下面举例子说明。首先定义一个接口
Java代码
public interface Ref {
public void f();
}
public interface Ref {
public void f();
}
接口的实现类
Java代码
public class RefImpl implements Ref {
//实现接口方法
public void f() {
System.out.println("public method f()");
}

void g(String args){
System.out.println("package method g():" + args);
}

private void w(){
System.out.println("private method w()");
}
}
public class RefImpl implements Ref {
//实现接口方法
public void f() {
System.out.println("public method f()");
}

void g(String args){
System.out.println("package method g():" + args);
}

private void w(){
System.out.println("private method w()");
}
}
测试类
Java代码
public class TestRef {

public static void main(String[] args) {
Ref ref = new RefImpl();
System.out.println(ref.getClass().getSimpleName()); //RefImpl类型
ref.f(); //调用接口方法
// ref.g(); //向上转型后实现类添加的方法不能调用
if(ref instanceof RefImpl){
RefImpl ref1 = (RefImpl)ref; //类型识别后转型
ref1.g("zhouyang");
// ref1.w(); //私有方法不能访问
}

//通过反射调用方法
try {
Ref ref2 = new RefImpl();
Method m = ref2.getClass().getDeclaredMethod("f");
Method m1 = ref2.getClass().getDeclaredMethod("g", String.class);//有参的方法
Method m2 = ref2.getClass().getDeclaredMethod("w");
System.out.println("==============");
m.invoke(ref); //调用方法f()
m1.invoke(ref, "yangzhou");

m2.setAccessible(true);///调用private方法的关键一句话
m2.invoke(ref);
} catch (Exception e) {
e.printStackTrace();
}

//java的javap反编译能够查看类的信息,-private 开关能够打开所有信息
//javap -private 类名 类必须是编译成.calss 文件

//利用反射访问私有成员,改变私有成员值,但是final域可以访问不可改变
PrivateField pf = new PrivateField();
// ps.ss; //私有成员不能访问
//打印原来的成员值
pf.print();
try {
//反射访问和改变原来值
Field[] f = pf.getClass().getDeclaredFields();
for(int i=0;i<f.length;i++){
f[i].setAccessible(true);
System.out.println(f[i].getType());//打印字段类型
System.out.println(f[i].get(pf)); //打印值
if("ss".equals(f[i].getName())){
f[i].set(pf, "hehe"); //修改成员值
}else{
f[i].setInt(pf, 55);
}

}
//重新打印修改后的成员值,final域值不变
pf.print();
} catch (Exception e) {
e.printStackTrace();
}
/*打印输出的结果
* RefImpl
public method f()
&nb
pieryon
2015-06-15 · 知道合伙人数码行家
pieryon
知道合伙人数码行家
采纳数:14410 获赞数:166868
获取软件设计师高级职称 万达金融最佳创新奖

向TA提问 私信TA
展开全部
Java反射之访问私有属性或方法

AccessibleObject类是Field、Method、和Constructor对象的基类。它提供了将反射的对象标记为在使用时取消默认Java语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用Field、Method和Constructor对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。

当反射对象的accessible标志设为true时,则表示反射的对象在使用时应该取消Java语言访问检查。反之则检查。由于JDK的安全检查耗时较多,所以通过setAccessible(true)的方式关闭安全检查来提升反射速度。

举例代码:
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
* 用Java反射机制来调用private方法
* @author pieryon
*
*/

public class Reflect {

public static void main(String[] args) throws Exception {

//直接创建对象
Person person = new Person();

Class<?> personType = person.getClass();

//访问私有方法
//getDeclaredMethod可以获取到所有方法,而getMethod只能获取public
Method method = personType.getDeclaredMethod("say", String.class);

//抑制Java对访问修饰符的检查
method.setAccessible(true);

//调用方法;person为所在对象
method.invoke(person, "Hello World !");

//访问私有属性
Field field = personType.getDeclaredField("name");

field.setAccessible(true);

//为属性设置值;person为所在对象
field.set(person, "WalkingDog");

System.out.println("The Value Of The Field is : " + person.getName());

}
}

//JavaBean
class Person{
private String name;

//每个JavaBean都应该实现无参构造方法
public Person() {}

public String getName() {
return name;
}

private void say(String message){
System.out.println("You want to say : " + message);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-03-18
展开全部
静态,用另一个取反射的方法



Class c;
Method m = c.getMethod("method name", new Class[] {int.class, int.class, int.class,int.class});
m.invoke(c, new Object[] {1,2, 3, 4});
更多追问追答
追问
为什么会提示b没有定义呢?
追答
LeverageUtil lv =new LeverageUtil();
Class a = lv.getClass();
Method b = a.getDeclaredMethod("isPoXlfICE", new Class[]{boolean.class});
b.setAccessible(true);
b.invoke(a, new Object[]{false}); //boolean 不支持null。Boolean则可以
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式