java 反射private属性_通过反射访问private的属性或方法

java中private只能被本类访问。但是还可以利用java中的反射从外界调用private变量或方法。

11082242.html

11082242.html

98cd230aa92ce06ade58a41a06c13a2e.png

package reflect;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

public class PrivateCarReflect {

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

//获取当前线程再获取类加载器

ClassLoader loader = Thread.currentThread().getContextClassLoader();

//通过类加载器获取我们想操作的类

Class clazz = loader.loadClass("reflect.PrivateCar");

//类转换一下

PrivateCar pcar = (PrivateCar) clazz.newInstance();

//field场地,declared宣告,

//field用于获取字段

Field colorFld = clazz.getDeclaredField("color");

//取消java语言访问检查以访问private变量

colorFld.setAccessible(true);

colorFld.set(pcar, "红色");

Method driveMtd = clazz.getDeclaredMethod("drive");

//取消java语言访问检查以访问protected方法

driveMtd.setAccessible(true);

driveMtd.invoke(pcar, (Object[])null);

}

}

反射Class类、Constructor类、Field类。

表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。

field中有修饰符、类型、变量名等复杂的描述内容,因此也可以将字段封装称为一个对象。用来获取类中field的内容,这个对象的描述叫Field。同理方法和构造函数也被封装成对象Method、Constructor。要想对一个类进行内容的获取,必须要先获取该字节码文件的对象。该对象是Class类型。

以下为AccessibleObject、Method、Field类源码:

//AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。

public class AccessibleObject implements AnnotatedElement {

/*

* 1、实现了AnnotatedElement对注解支持的相关方法

* 2、提供访问控制

/

void setAccessible(boolean flag)

设置该对象(Field,Constructor,Method)是否可访问

boolean isAccessible()

该对象是否可访问

void setAccessible(AccessibleObject[] array, boolean flag)

设置这一组对象(Field,Constructor,Method)是否可访问

}

public interface Member{

public static final int PUBLIC = 0; //标识类或接口的所有已声明成员的集合。

public static final int DECLARED = 1; //标识类或接口的所有公共成员(包括继承成员)的集合。

public Class> getDeclaringClass();// 所在类

public String getName(); //返回此 Member 表示的底层成员或构造方法的简单名称。

public int getModifiers(); //作为整数返回由此 Member 所表示的成员或构造方法的 Java 语言修饰符。

public boolean isSynthetic(); //如果此成员是编译器引入的,则返回 true;否则,返回 false。

}

public final class Field extends AccessibleObject implements Member{

// 1.字段的设值和取值 ,对于静态属性,obj传null

set(Object obj, Object value)

setXX(Object obj, Object value) ,比如setInt,setBoolean

Object get(Object obj)

getXX(Object obj) ,比如getInt,getBoolean

// 2.字段上注解的获取

getDeclaredAnnotations()

getAnnotation(Class annotationClass);

// 3.字段类型

Type getGenericType();

Class> getType();

// 4.字段修饰符

int modifer=field.getModifiers();

String modify = Modifier.toString(modifiers);

// 5.字段名称

String getName();

}

参考博客:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值