Java 反射之私有字段和方法详细介绍
程序员文章站
2023-12-01 19:24:04
尽管我们通常认为通过java的反射机制来访问其它类的私有字段和私有方法是可行的,其实并没有那么困难。 注释:只有在单独的java程序中运行该代码才有效,就像你做一些单元测试...
尽管我们通常认为通过java的反射机制来访问其它类的私有字段和私有方法是可行的,其实并没有那么困难。
注释:只有在单独的java程序中运行该代码才有效,就像你做一些单元测试或者常规的程序。如果你尝试在java applet内使用该方法,你需要稍稍修改securitymanager。但是,因为你不是经常需要与它打交道,这里也就不再赘述了。
这里是本次内容的列表:
1.访问私有字段。
2.访问私有方法。
访问私有字段:
为了访问私有字段,你需要调用class.getdeclaredfield(string name)或者class.getdeclaredfields()方法。方法class.getfield(string name)和class.getfields()仅仅返回共有的字段,所以它们都无法起到作用。这里有一个例子,该例子中有一个包含私有字段的类,在该类下面有通过反射访问私有字段的代码。
public class privateobject {
private string privatestring = null; //声明为私有字段
public privateobject(string privatestring) {
this.privatestring = privatestring;
}
}
privateobject privateobject = new privateobject("the private value");//实例化对象
field privatestringfield = privateobject.class.
getdeclaredfield("privatestring");
privatestringfield.setaccessible(true);//允许访问私有字段
string fieldvalue = (string) privatestringfield.get(privateobject);//获得私有字段值
system.out.println("fieldvalue = " + fieldvalue);
这个代码会打印出文本"fieldvalue = the private value",而该值正好是对象privateobject的私有字段privatestring的值。
注意到我们使用了方法privateobject.class.getdeclaredfield("privatestring")。正是这个调用这个方法返回了私有字段。这个方法仅仅根据指定的类返回字段,不会返回父类申明的字段。
另外仔细观察加粗的语句。通过调用 field.setaccessible(true),你关掉了对于这个指定字段实例的访问检查,仅仅对反射有效。现在你能访问它了,不管它是私有的,保护的或是默认的(default),即时调用者并不在该范围中。你仍然不能通过常规方法访问该字段,因为编译器不允许。
访问私有方法
为了访问一个私有方法,你需要调用class.getdeclaredmethod(string name,class[] parametertypes)或者class.getdeclaredmethods()方法。方法class.getmethod(string name,class[] parametertypes)和class.getmethods()仅仅返回公有方法,所以它们不会起到作用。下面是一个简单的例子,该例子中有一个拥有私有方法的类,类下面是通过反射机制访问私有方法的代码。
public class privateobject {
private string privatestring = null;
public privateobject(string privatestring) {
this.privatestring = privatestring;
}
private string getprivatestring(){//私有方法
return this.privatestring;
}
}
privateobject privateobject = new privateobject("the private value");
method privatestringmethod = privateobject.class.
getdeclaredmethod("getprivatestring", null);
privatestringmethod.setaccessible(true);
string returnvalue = (string)
privatestringmethod.invoke(privateobject, null);
system.out.println("returnvalue = " + returnvalue);
这个代码例子会打印出文本"returnvalue = the private value",该值正好是私有方法的返回值。
注释:只有在单独的java程序中运行该代码才有效,就像你做一些单元测试或者常规的程序。如果你尝试在java applet内使用该方法,你需要稍稍修改securitymanager。但是,因为你不是经常需要与它打交道,这里也就不再赘述了。
这里是本次内容的列表:
1.访问私有字段。
2.访问私有方法。
访问私有字段:
为了访问私有字段,你需要调用class.getdeclaredfield(string name)或者class.getdeclaredfields()方法。方法class.getfield(string name)和class.getfields()仅仅返回共有的字段,所以它们都无法起到作用。这里有一个例子,该例子中有一个包含私有字段的类,在该类下面有通过反射访问私有字段的代码。
复制代码 代码如下:
public class privateobject {
private string privatestring = null; //声明为私有字段
public privateobject(string privatestring) {
this.privatestring = privatestring;
}
}
复制代码 代码如下:
privateobject privateobject = new privateobject("the private value");//实例化对象
field privatestringfield = privateobject.class.
getdeclaredfield("privatestring");
privatestringfield.setaccessible(true);//允许访问私有字段
string fieldvalue = (string) privatestringfield.get(privateobject);//获得私有字段值
system.out.println("fieldvalue = " + fieldvalue);
这个代码会打印出文本"fieldvalue = the private value",而该值正好是对象privateobject的私有字段privatestring的值。
注意到我们使用了方法privateobject.class.getdeclaredfield("privatestring")。正是这个调用这个方法返回了私有字段。这个方法仅仅根据指定的类返回字段,不会返回父类申明的字段。
另外仔细观察加粗的语句。通过调用 field.setaccessible(true),你关掉了对于这个指定字段实例的访问检查,仅仅对反射有效。现在你能访问它了,不管它是私有的,保护的或是默认的(default),即时调用者并不在该范围中。你仍然不能通过常规方法访问该字段,因为编译器不允许。
访问私有方法
为了访问一个私有方法,你需要调用class.getdeclaredmethod(string name,class[] parametertypes)或者class.getdeclaredmethods()方法。方法class.getmethod(string name,class[] parametertypes)和class.getmethods()仅仅返回公有方法,所以它们不会起到作用。下面是一个简单的例子,该例子中有一个拥有私有方法的类,类下面是通过反射机制访问私有方法的代码。
复制代码 代码如下:
public class privateobject {
private string privatestring = null;
public privateobject(string privatestring) {
this.privatestring = privatestring;
}
private string getprivatestring(){//私有方法
return this.privatestring;
}
}
复制代码 代码如下:
privateobject privateobject = new privateobject("the private value");
method privatestringmethod = privateobject.class.
getdeclaredmethod("getprivatestring", null);
privatestringmethod.setaccessible(true);
string returnvalue = (string)
privatestringmethod.invoke(privateobject, null);
system.out.println("returnvalue = " + returnvalue);
这个代码例子会打印出文本"returnvalue = the private value",该值正好是私有方法的返回值。
上一篇: hadoop 单机安装配置教程
下一篇: 房子矢量图素材(ps图片转矢量图教程)