Java动态代理类抛出java.lang.ClassCastException异常-程序员宅基地

技术标签: Java代理类  【Java系列】  java.lang.ClassCastException  

Java中自带的动态代理InvocationHandler接口、Proxy类只能针对接口进行动态代理,如果要对类进行代理可以使用第三方的类库像CGLIG等相关对字节码操作实现的类库;

下面我们可以看一下使用Java动态代理代理类会发生什么异常:

  • 创建一个接口类ProxyPeople
package com.test.Application;

public class ProxyPeople {

    public String work(String name) {
        System.out.println("工作名称是==》"+name);
        return name;
    }
}
  • 创建一个代理类的调用处理程序ProxyHandler
package com.test.Application;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler{
    

    private Object obj;

    public ProxyHandler(Object obj) {
            this.obj = obj;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        return method.invoke(obj, args);
    }

}
  • 客户端程序调用类中的work方法
package com.test.Application;

import java.lang.reflect.Proxy;

public class Test1 {

    public static void main(String[] args) {
        ProxyPeople people = new ProxyPeople();

        ProxyHandler handler = new ProxyHandler(people);
        ProxyPeople proxy = (ProxyPeople)Proxy.newProxyInstance(handler.getClass().getClassLoader(), people.getClass().getInterfaces(), handler);

        Object obj = proxy.work("财务");
        System.out.println(obj);
    }
}
  • 运行客户端程序将会抛出类转换异常
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to com.test.Application.ProxyPeople
    at com.test.Application.Test1.main(Test1.java:11)

这个示例也说明了Java代理不可以对类进行代理,只能针对接口代理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yaomingyang/article/details/81041413

智能推荐

微信小程序使用阿里云物联网API开发物联网应用_小程序 阿里云物联网云端api-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏32次。阿里云物联网云端API参考https://help.aliyun.com/document_detail/69893.html?spm=a2c4g.11186623.6.743.66a92125iuKyp3阿里云物联网OpenAPIhttps://api.aliyun.com/?spm=a2c4g.11186623.2.15.478753ccOZrVVE#/?product=Iot云端SDK参考https://help.aliyun.com/document_detail/30579.h_小程序 阿里云物联网云端api

[华中科技计组实验]logisim完成运动码表_logsim运动码表实验-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏58次。自己动手画cpu系列 建设中ing 仅供参考!在这首推华中科技大学计算机组成原理实验课mooc连接初衷:在mooc上看见了本课觉得超赞,本人已完成了课中所有的实验,在做实验的过程中有时候实验会没有思路或者有些bug会浪费很多时间,目前呢也没找到完整的答案,所以做了份自己的答案给大家困惑的时候一份参考(大神请忽视,我自己也就一弱鸡),也就给大家卡壳的时候能有个找灵感的地方,请先独立思考,切勿抄袭。tips:每个部分都是先贴答案再写思路 数字逻辑基础 数据表示实验 运算器设计_logsim运动码表实验

网络爬虫详解-程序员宅基地

文章浏览阅读7.4k次,点赞5次,收藏46次。网络爬虫(web crawler,又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。产生背景随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南

【Mybatis】使用<resultMap>接收一对多查询的结果_resultmap 一对多数据返回变成两个了-程序员宅基地

文章浏览阅读2.6k次,点赞3次,收藏5次。业务场景: 今天在工作的时候需要编写一个接口:传入一个userId查出所有由该用户提出的问题,并且将该问题下的所有回答也查出来。 这涉及到了两张表:Question(问题表)和Comment(评论表,包含一个question_id字段指向所属的问题主键ID),这两张表是一对多的关系。 处理思路是写一条SQL语句以question_id为条件将Question左连接Comment,并且使用resultMap进行接收。 resultMap中可用&..._resultmap 一对多数据返回变成两个了

论C语言两整数平均值的4种算法-程序员宅基地

文章浏览阅读2.7k次。小学数学中我们就学过一种简单的求解两个整数平均数的算法(a+b)/2,当然它同样适用于我们的C语言#include<stdio.h>#include<stdlib.h>intmain(){inta=10;intb=20;printf("%d\n",(a+b)/2);system("pause");ret..._c/c++之如何计算两个整型的平均值

微信h5页面返回时ios不刷新页面解决方案_微信跳转h5,h5内页面返回不会刷新-程序员宅基地

文章浏览阅读3.4k次。在做微信h5页面的时候,我们需要返回时刷新前一个页面的数据,比如在页面A点击支付按钮跳转到页面B,从页面B返回时要获取当前订单的支付状态防止重复支付。在安卓手机上不会有困扰,因为安卓手机在微信h5中返回都会刷新页面,而由于ios手机上的微信webView版本的问题,返回时会直接从缓存中拿而不会刷新页面。解决这一问题想到了vue-router,vue-router不就是有路由钩子吗?它主要用的h..._微信跳转h5,h5内页面返回不会刷新

随便推点

laravel 5.6集成 swagger3 和swagger-ui 步骤_larveal 5.6 swagger-ui.css 加载出错-程序员宅基地

文章浏览阅读3.8k次。git地址packagist地址swagger在线edit安装swaggercomposer require zircote/swagger-php然后创建一个 swagger function getJson/** * @SWG\Swagger( * host="qs.com", * consumes={"multipart/form-data"}, * ..._larveal 5.6 swagger-ui.css 加载出错

在Visual C++中使用内联汇编_vc c++ asm-程序员宅基地

文章浏览阅读619次。在Visual C++中使用内联汇编目录:  文档内容:一、内联汇编的优缺点因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C++中不能处理的一些事情,而且可以使用在C/C++中的变量,所以非常方便。内联汇编主要用于如下场合:1.使用汇编语言写函数; 2.对速度要求非常高的代码; 3.设备驱动程_vc c++ asm

ntp时间服务器源码编译安装_ntp源码安装-程序员宅基地

文章浏览阅读3k次。1.下载、解压安装包,wget https://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-4.2.8p11.tar.gztar -zxvf ntp-4.2.8p11.tar.gz2.然后编译安装mkdir -p /usr/local/ntpcd ntp-4.2.8p11./configure --prefix=/usr/local/ntp --enable-all-clocks --enable-parse-clocksmake.._ntp源码安装

C++设计模式-程序员宅基地

文章浏览阅读2.6k次。C++设计模式之Adapter2002-08-06· · ··COM集中营一、功能   将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。   二、结构图  (1)class adapter   (2)object adapter   _c++设计模式

java字段不序列化注解_关于数据序列化(5),定制FastJSON序列化(解决Java大Long类型js的Number接收丢失数据的问题,不序列化某些属性)...-程序员宅基地

文章浏览阅读816次。1. 指定某个类型序列化问题描述:JavaScript使用IEEE 754标准1位用来表示符号位11位用来表示指数52位表示尾数javaScript对于整形只能识别52位。遇到Long大整数可能会丢失数据因为后台是Java写的难免有属性的类型是long。本来项目的做法是手动写每个类的toString();方法要拼接很多双引号。比较费劲也容易出错。后来我使用了FastJson定制序列化遇到Long就..._java注解不序列化字段

ceph学习(故障恢复)——mon全部故障,从osd中恢复集群_ceph学习(故障恢复)——mon全部故障-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏14次。在生产环境中,ceph集群要求最少配置3个MON,一般情况下很少出现3个MON同时挂掉的情况,但是也不排除出现这种情况的可能,如果集群中的所有MON都损坏了,是不是集群数据就丢失了呢?能不能恢复集群?当然是可以的,ceph中国的一位开发者写了一个工具,来对损坏的MON的数据进行重构,这个工具已经集成到了新版的ceph中,官网上也提供了一个重构的脚本,但是这个脚本似乎有点问题,网上也有一些相关..._ceph学习(故障恢复)——mon全部故障