C# 如何通过反射改变私有属性的值?
你需要初始化一个ReflectionPermission对象,并使用MemberAccess的ReflectionPermissionFlag初始化,调用Demand请求权限,如果上下文允许你这么作不会出现安全问题,代码就不会抛出异常继续执行,你就可以通过反射访问私有成员了
反射获取私有属性_反射获取私有属性的值
但是提醒你,这么做危险性很大,破坏了类的封装性,建议不要这么作,调试极其困难
废话不多说,直接上代码
public void SetFields(this object arg)
{Type type = arg.GetType();
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var fieldIfo in fieldInfos)
{if(fieldIfo.Name == "你的属性或字段命名"){
fieldIfo.SetValue(arg,值);
}}
}
ja里一个私有的属性如何在其他类里面进行访问?
主要有两种方式:
种方式
在这个私有属性的类中为该属性提供get和set方法。
第二针方式
如果不能提供get和set方法就用反射来获取,Ja中说的封装可以被反射打破。
Ja反射 在只知道类名的情况下,怎样给其中的私有属性赋值
利用反射能
//假设类名为A
// 实例化类
A p = new A();
// 获取class
Class c = p.getClass();
// 获取该类所有的字段
Field[] fields = c.getDeclaredFields();
// 遍历赋值
for (int i = 0; i < fields.length; i++) {
String filedName = fields[i].getName();
// AccessibleTest类中的成员变量为private,故必须进行此作
fields[i].setAccessible(true);
// 判断类型
Class> type=fields[i].getType();
//获取字段类型
String typeName=type.getName();
System.out.println(type.getName());
// 对字段进行赋值 个参数为对象引用第二个参数为要附的值
//如果为字符串类型
if("ja.lang.String".equals(typeName)){
fields[i].set(p, "1");
}//如果为日期类型
else if("ja.util.Date".equals(typeName)){
fields[i].set(p, new Date());
}else{
fields[i].set(p, 1);
}}//楼主我只是简单的写了下。可能还需要判断字段名称以及其他类型什么的。 希望楼主多看看ja 文档。
ja反射访问私有方法的的问题
Ja反射之访问私有属性或方法
AccessibleObject类是Field、Method、和Constructor对象的基类。它提供了将反射的对象标记为在使用时取消默认Ja语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用Field、Method和Constructor对象来设置或获得字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。
当反射对象的accessible标志设为true时,则表示反射的对象在使用时应该取消Ja语言访问检查。反之则检查。由于JDK的安全检查耗时较多,所以通过setAccessible(true)的方式关闭安全检查来提升反射速度。
举例代码:
import ja.lang.reflect.Field;
import ja.lang.reflect.Method;
/
用Ja反射机制来调用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);
//抑制Ja对访问修饰符的检查
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());
}}
//JaBean
class Person{
private String name;
//每个JaBean都应该实现无参构造方法
public Person() {}
public String getName() {
return name;
}private void say(String message){
System.out.println("You want to say : " + message);
}}
静态,用另一个取反射的方法
如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});
一个ja对象的属性是私有的,而且没有提供public的get和set方法,可以用反射的方式将其转成json吗?
可以通过反射直接设置或读取私有成员,int age = Person.class.getField("age").get(p);或者int age=p.getClass().getField("age").get(p);
Ja反射设置私有属性和获取属性
Ja代码
package ;
import ja lang reflect Field;
import ja lang reflect InvocationTargetException;
import ja lang reflect Method;
public class TestBean {
private int age;
public static void main(String []args) throws InstantiationException IllegalAccessException SecurityException NoSuchFieldException{
try {
Class> class =Class forName( TestBean );
Object tObject=class newInstance();
Field field=class getDeclaredField( age );
field setAccessible(true); //设置私有属性范围
field set(tObject );
System out print(field get(tObject));
try {
Method method=class getMethod( setAge int class);
method invoke(tObject );
Method getMethod=class getMethod( getAge );
System out println(getMethod invoke(tObject));
} catch (NoSuchMethodException e) {
// TODO Auto generated catch block
e printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto generated catch block
e printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto generated catch block
e printStackTrace();
}} catch (ClassNotFoundException e) {
// TODO Auto generated catch block
e printStackTrace();
}}
public int getAge() {
return age;
}public void setAge(int age) {
this age = age;
}lishixinzhi/Article/program/Ja/hx/201311/26324
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。