反射调用私有实现类的方法出异常的分析

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络 本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。 阅读详情

原始内容如下:

http://www.java2000.net/viewthread.jsp?tid=6982

http://topic.youkuaiyun.com/u/20080707/10/a718ad57-a28d-4492-b1e9-f3048671260a.html

我们先看测试代码:

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class T {
  public static synchronized void main(String[] a) throws Exception {
    T t = new T();
    Method m = t.getClass().getMethod("hasNext");
    System.out.print(m.invoke(t));
    List<T> list = new ArrayList<T>();
    list.add(t);
    Iterator it = list.iterator();
    m = it.getClass().getMethod("hasNext");
    System.out.print(m.invoke(it));
  }

  public boolean hasNext() {
    return true;
  }
}

运行结果为

trueException in thread "main" java.lang.IllegalAccessException: Class T can not access a member of class java.util.AbstractList$Itr with modifiers "public"

第一个true我们就不分析了,关键是第二个为何为异常??我们来看几个楼层的回复

Java2000_net:

T的getClass返回T,他的hasNext是一个public 方法,所以可以正常调用,输出true; 

而 Iterator的 getClass 返回的是一个 java.util.AbstractList$Itr 

我们可以输出看看 

System.out.println(it.getClass()); 

那个Itr是一个inner Class, 其 hasNext 不是一个public方法,所以无法调用。 

关键就是Iterator是一个接口而已。

Any_Yan:

呵呵,很有意思的一个问题! 

ArrayList继承自AbstractList,其iterator()方法返回内部类Itr的一个实例,而AbstractList的内部类Itr签名是private  关键问题在最后一行"System.out.print(m.invoke(it));"上 

Method的invoke方法参数是一个对象,内部到底决定是谁去调用这个Method呢?这里显然最后JVM决定用T来调用这个"hasNext"的Method对象,T肯定没有访问它的权利,至于底层原理,我会整明白再来回答,呵呵,上班暂时没空

import java.lang.reflect.Method;

public class T {
  public static void main(String[] args)throws Exception{
      T t = new T();
      Sam sam = t.getIt();
      Method m = sam.getClass().getMethod("f");
      System.out.println(sam.getClass());
      m.invoke(sam);
  }

  private class It implements Sam{
    public void f(){
      System.out.println("F method");
    }
  }

  public Sam getIt(){
     return new It();
  }
}



public interface Sam{
    public void f();
}

无语了,自己也模仿这个例子写了个程序,却无法重新楼主程序里出现的问题,一下子推理也不知道从哪里开始了。楼主那个程序中的异常是从Method类的invoke方法中有下面这行抛出来的: 

其中caller是sun.reflect.Reflection.getCallerClass(1)返回的,由于不提供源码,所以无法深入跟踪 

而clazz是Method对象的getDeclaringClass()方法返回的,这里就是AbstractList$Itr没有问题 

obj是传入的iterator()方法返回的Iterator实现类对象也没有问题 

modifiers是1,也就代表是Public方法,并不是7楼老紫竹说的,hasNext确实是一个Public方法 

那么唯一可能出问题的就是第一个参数getCallerClass()返回的估计是Class T,而不是Class AbstractList$Itr类对象 

Java2000_net

原因我找到了,是package的问题,请看如下代码: 下面是3个模仿的类,用于测试,请注意其package为 a

package a;
public interface MyCollection {
  public MyIterator myIterator();
}
package a;
public interface MyIterator {
  public void myHasNext();
}
package a;
public class MyArrayList implements MyCollection {
  private class It implements MyIterator {
    public void myHasNext() {
      System.out.println("myHasNext method");
    }
  }

  public MyIterator myIterator() {
    return new It();
  }
}

下面是我的测试类

package b;
import java.lang.reflect.Method;
import a.MyArrayList;
import a.MyCollection;
import a.MyIterator;

public class TestInvoke {
  public static void main(String[] args) throws Exception {
    MyCollection t = new MyArrayList();
    MyIterator sam = t.myIterator();
    Method m = sam.getClass().getMethod("myHasNext");
    m.invoke(sam);
  }
}

请注意其package为b 运行结果为

Exception in thread "main" java.lang.IllegalAccessException: Class b.TestInvoke can not access a member of class a.MyArrayList$It with modifiers "public"
        at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at b.TestInvoke.main(TestInvoke.java:12)

 

如果你把测试类的放在和前面的3个类相同的package a 里面,则不会抱异常。

结论:

同包的可以调用。 不同包的比可以调用private的东西,虽然接口是public的







<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
Linux ARM平台开发系列讲解(网络篇)1.3 MDIO总线设备device和设备driver匹配 在设备和驱动都载入内核后,设备和驱动是如何匹配起来的呢?其实他们就是通过的唯一标识phyID进行匹配phy_dev和phy_drv是通过phy_bus_match函数进行匹配,匹配成功后会建立链表链接,具体流程如下图: 返回总目录...... 阅读详情

相关推荐

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 429

SQLSERVER2000 不能被JAVA程序或者其他主机的SQLSERVER客户端访问的问题

详细解答请看:http://www.java2000.net/viewthread.jsp?tid=394 首先看装有SQLSERVER2000的主机上是否开启1433端口,并监听,如果没有则打补丁。在2003的操作系统上:如果是原装SQLSERVER2000(没有打过任何补丁)直接打SP3。在XP上:如果是原装SQLSERVER2000(没有打过任何补丁)直接打SP3。(我先打了

lizhihui200的专栏 477

SAP 更改物料基本计量单位

创建订单单位后,新创建的采购申请、采购合同、采购信息记录均会使用新的订单单位

matinal 當冬夜漸暖 。公众号:matinal 6162

优快云博客里面挂广告的推荐方法

优快云博客里面挂广告的推荐方法 此文章版权归JAVA世纪网(JAVA2000.net)和优快云(youkuaiyun.com)所有. JAVA世纪网地址:http://www.java2000.net/p10652 优快云博客地址:http://blog.youkuaiyun.com/java2000_net/archive/2008/10/04/3015606.aspx 如转载,请保留此说明和完整的...

java交流平台 920

Yolov5实现道路裂缝检测

Yolov5实现道路裂缝检测 参考代码链接 Github代码链接 基于Pytorch的Yolov5道路裂缝检测程序运行说明。大家可以结合我的说明和原文说明使用,有问题欢迎询问。 文章目录Yolov5实现道路裂缝检测环境要求测试训练自己的数据集1.创建dataset.yaml文件2.创建标签文件3.组织文件路径4.选择模型5.开始训练 环境要求 Python 3.8或之后的版本 还要安装requirements.txt文件中所有依赖包,包括1.7及以上版本的torch $ pip install -r req

qq_26751379的博客 2万+

机器人视觉实战:用OpenCV搞定手眼标定(附完整C++代码)

本文详细介绍了使用OpenCV实现机器人视觉中的手眼标定技术,包括核心算法、工业场景优化及完整C++代码示例。通过解析坐标系转换问题,提供从数据采集到标定验证的全流程解决方案,帮助开发者在复杂工业环境中实现高精度机械臂与视觉系统的协同作业。

weixin_29306571的博客 482

java反射调用方法时,Class . can not access a member of class . with modifiers "private" 等异常解决

先看javabean类:目的使用反射调用私有方法:package com.imooc.reflect;public class Student { private void add(){ System.out.println("增加数据!"); } private int id; private String name; public int ge

chaplinlong的博客 5万+

研发工作量科学量化评估模型:从多维系数到等级落地指南

摘要:本文提出了一套基于多维系数的科学量化评估模型,用于精准评估软件开发工作量。该模型从需求复杂度、技术难度、质量要求和依赖风险四个核心维度进行量化评估,通过系数乘积计算综合工作量。文章详细说明了各维度的系数区间划分标准,并演示了从基础工作量估算到综合系数计算的具体步骤。该模型通过结构化评估过程,将主观经验转化为客观量化指标,帮助团队提高工作量评估的准确性,增强项目交付的可预测性。其价值在于使评估过程透明化、结构化和可追溯,从而减少项目延期风险,优化资源规划。

友莘居士的博客 1685

Class xx can not access a member of xx with modifiers public

写作背景 今日进行代码重构之后,执行单元测试时报了IllegalAccessException,一般为调用反射代码时没有权限。问题是反射的代码是由底层的jar来实现,而不是自己写的代码;并且之前的单元测试都没有问题。仔细看了一下,异常信息最后的信息为不到一个带有public static final修饰的成员,也就是找不到一个常量。 分析 首先明确一点就是该异常就是访问权限不够所致。一般遇到此问题,异常信息为Caused by: java.lang.IllegalAccessException: Class

笔墨的专栏 2995

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 731

LabVIEW面向对象编程:操作者框架入门实战

本文是LabVIEW面向对象编程中操作者框架的入门实战指南。针对传统“面条式代码”在复杂项目中的维护难题,文章通过创建操作者、定义消息与处理函数、在主VI中调用等步骤,详细演示了如何利用操作者框架构建模块化、易扩展的应用程序架构,有效管理并行任务。

f0g1h2的博客 591

can not access a member of class with modifiers "private"

java.lang.IllegalAccessException: Class com.huaxin.cloud.village.service.OperationReportService can not access a member of class com.huaxin.cloud.village.entity.OperationReport with modifiers “private...

jieyigeweixiao的博客 1万+

OpenClaw第2章:快速安装

本章将手把手教你安装 OpenClaw。

Maynor的博客 3237

Java通过反射调用一个类的私有方法

本文转载自:https://www.cnblogs.com/ghq120/p/8439204.html 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法   Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法)   Method method=clazz.getMethod(name);//...

样young的博客 3万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java的反射机制 调用私有方法私有属性

一、Java反射简介 二、Class类 三、反射访问成员变量 四、反射访问方法 五、常见异常及问题 1 什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。 这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 2 Java反射机制的功能 1)在运行时判断任意一个对象所属的类; 2)在运行时构造任意一个类的对象; 3)在...

码灵的博客 2394

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# 反射调用私有事件

在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用

lindexi 2689

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

反射获得接口的实现了以及反射调用方法

通过反射获得接口的实现类的全路径,然后根据全路径得到class对象,调用对象的某个方法。 1:反射获得某个接口的全路径 try{ List<String> cacheClassList = Lists.newArrayList(); //根据接口类型返回相应的所有bean Map<String, CommandLineRunner> map = applicationContext.getBeansOfTy

zz18532164242的博客 4493

【Java反射黑科技】:手把手教你调用私有方法的3种实战方案

掌握Java反射获取私有方法并调用的实用技巧,解决无法访问私有成员的难题。涵盖setAccessible、Method.invoke等核心方法,适用于单元测试与框架开发,突破访问限制,提升灵活性。三种方案详解,值得收藏。

SimTrans的博客 882

java反射调用带异常的方法_Java反射调用方法时捕获异常

问题描述反射调用方法时,方法内部抛出了自定义异常,但是无法在反射调用的时候捕获到抛出的自定义异常。代码如下:// 自定义异常public class MyException extends Exception {private static final long serialVersionUID = -7998753885990231365L;private String code;public ...

weixin_31040783的博客 1517

利用Java反射机制调用类的私有方法

利用Java反射机制调用类的私有方法引言来吧·展示参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn.stady; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 利用java反射机制调用类的私有方法 * * @author Qing * @date 2021/9/9 13

无敌柚子的博客 2847

87.怎么用java反射得到一个类的私有方法?

java反射得到一个类的私有方法 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法) (3)method.toGener...

weixin_44078485的博客 1951

通过Java反射调用类

通过Java反射调用类 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术:My Eclipse 10 ,Java 作者:陈显其 撰写时间:2019/5/6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_44580670的博客 2151

《Unity 反射入门到实战:从获取私有字段到调用非公开方法的实操指南》

反射是指在程序运行时,动态获取类型信息并操作对象的能力。在Unity中,基于C#的反射API(如命名空间)让您能访问那些通常被隐藏的成员。例如,一个类的私有字段(如)或受保护方法(如),在编译时无法直接调用,但通过反射就能在运行时实现。这为游戏开发提供了极大的灵活性,但需注意性能开销和潜在风险。通过本指南,您已学习了Unity反射的核心技能:从获取私有字段到调用非公开方法,并通过实战案例巩固了知识。反射是Unity开发中的一把双刃剑——合理使用时,能解锁强大功能;滥用则带来风险。

ygcghjshjkjk的博客 1542

java中方法的反射调用示例

要动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个Method类型的对象或者数组。如果是访问指定的构造方法,需要根据该方法的入口参数的类型来访问。例如,访问一个名称为max,入口参数类型依次为int和String类型的方法。静态方法名称说明getName()获取该方法的名称按照声明顺序以Class数组的形式返回该方法各个参数的类型以Class对象的形式获得该方法的返回值类型以Class数组的形式获得该方法可能抛出的异常类型。...

Hell_potato777的博客 3247

java 获取反射异常信息_深入分析Java反射(六)-反射调用异常处理

前提Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。本文主要介绍一个使用反射一定会遇到的问题-反射调用异常处理。反射调用异常处理反射调用出现异常的方法主要考虑下面的情况:属性操作:java.lang.reflect.Field#set(Obj...

weixin_39936086的博客 1071

Java反射如何动态调用私有方法?步骤详解

本文介绍了如何使用Java反射技术动态调用Java对象的私有方法。文章首先概述了Java反射的基本概念和特性,重点阐述了反射在访问私有方法和动态调用方面的优势。随后详细讲解了动态调用私有方法的四个关键步骤:获取目标对象的Class对象、确定私有方法的访问修饰符、使用invoke()方法进行动态调用,以及处理异常和返回值。最后提出了使用反射技术时的注意事项,包括目标对象验证、异常处理和高级反射机制的选择等。本文为开发人员提供了利用反射机制访问私有方法的实用指南。

2501_90410679的博客 92
上一篇: 关于split分割字符串,空结果不能得到的问题
下一篇: 判断数字是否为double的正则表达式
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值