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

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<T> annotationClass);   // 3.字段类型  Type getGenericType();  Class<?> getType();  // 4.字段修饰符  int modifer=field.getModifiers();  String modify = Modifier.toString(modifiers);  // 5.字段名称  String getName();
}

 

参考博客:

https://www.cnblogs.com/ktlshy/p/4716838.html
https://blog.csdn.net/qq_19701185/article/details/55007318
https://blog.csdn.net/qq_41238313/article/details/78916041

转载于:https://www.cnblogs.com/wzdnwyyu/p/11082242.html

通过反射访问private的属性或方法相关推荐

  1. Vue父组件访问子组件属性和方法、父子组件双向绑定(两种方法)

    Vue父组件访问子组件属性和方法.父子组件双向绑定(两种方法) 1. 使用vue-cli创建项目 目录结构如下图: 2. 编写代码 src/components/HelloWorld.vue < ...

  2. 关于“继承, 子类拥有父类非private的属性和方法“

    我们以前经常看到这么一句话: "继承,  子类拥有父类非 private 的属性和方法."; 但是我们又会经常看到这样的代码 父类: public class People {pr ...

  3. java反射访问室友属性_如何与家人,室友和客人共享HomeKit访问权限

    java反射访问室友属性 What's the point of having a house of the future if your family members, roommates, or ...

  4. 访问对象的属性和方法

    class Person(object):name = ""age =0height = 0weight = 0def run(self):print("run" ...

  5. 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等

    这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...

  6. 面试官:private修饰的方法可以通过反射访问,那么private的意义是什么?

    欢迎关注方志朋的博客,回复"666"获面试宝典 Java,在一个类中,为了不让外界访问到某些属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名) ...

  7. java this关键字表示当前对象,可以访问属性、方法、构造方法

    this关键字的三种访问方式:属性.方法.构造方法 1.访问属性 为了命名的规范,利用this关键字区分了属性与局部变量 public class Persion {String name;char ...

  8. 【面试题】Vue2为什么能通过this访问到data、methods的属性或方法

    在我没接触vue之前我不着调this是啥压根就没有接触过,在我学过了vue之后我知道了this,那时候理解的this就是你要使用data中的属性或调用methods中的方法等其他东西都要用this去调 ...

  9. java反射机制调用带参数的方法_Java反射机制:跟着代码学反射

    1. 前言 在OOP的世界里,万物皆对象.也就是说,我们可以将任何东西抽象成一个对象. 比如人,可以抽象成一个Person类,通过new Person()来实例化一个对象:再比如鸭子,可以抽象成一个D ...

  10. 趣味教程:从女娲造人谈类、属性、方法及实例

    前言:相信大家都听说过女娲造人的故事,不过细节可能不会太清楚,我现在略述如下,您可要仔细听哦,这和我们今天要聊的主题有莫大的关系呀. 女娲是一个人身龙尾的女神.盘古开天辟地以后,也就在天地间到处游历. ...

最新文章

  1. AI换脸鉴别率超99.6%,微软用技术应对虚假信息
  2. Intel Optane(tm) Memory Pinning 无法加载DLLiaStorAfsServiceApi.dll:找不到指定模块。(异常来自HRESULT:0x8007007E)。
  3. 当 高并发系统下 Redis 发生高延迟时,其内部到底发生了什么
  4. linux系统安装serv u,建立第一个可用的FTP服务器
  5. python中构造函数可以重载吗_python中的函数重载了吗?
  6. bzoj 1296: [SCOI2009]粉刷匠(DP+DP)
  7. 通过证书连接服务器的小命令
  8. element的表格中scope中的东西
  9. 高斯混合模型(GMM)和高斯过程回归(GPR)的学习
  10. 湖南成考新生如何查询学籍信息
  11. 聆秘2013手游渠道之争:四大战役谁主沉浮?
  12. 苦涩的技术我该怎么学?Akka 实战
  13. 信息学奥赛一本通:1026:空格分隔输出
  14. 常用二十六大学术搜素引擎
  15. K210入门,用wifi通讯
  16. 《求职》第四部分 - 操作系统篇 - 操作系统基础
  17. 计算机系导师推荐意见,就业推荐表上导师评语
  18. 用Latex输入微米(micron)或者微秒的方法
  19. indigo版本teb_local_planner常见编译问题
  20. 办理公司经营贷款需要什么条件呢?-民兴商学院

热门文章

  1. SQL-SERVER触发器
  2. SpringBoot学习之一 Unable to find a single main class from the following candidates
  3. cookie 设置有效期 检测cookie
  4. 201521123026《Java程序设计》第2周学习总结
  5. 浅谈 JSON 那些被转义的字符们
  6. Redisbook学习笔记(1)字典(2)
  7. 跨域认证--使用Passport
  8. Ubuntu使用记录:安装deb软件方法以及apt、apt-get和dpkg的区别
  9. 日常笔记(持续更新)
  10. tomcat 发布到服务器启动不了