1. 首页 > 电脑手机 >

反射获取私有属性_反射获取私有属性的值

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 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息