动态代理模式使用初探

jdk文档:

写道
动态代理类(以下简称为代理类)是一个实现在创建类时在运行时指定的接口列表的类,该类具有下面描述的行为。 代理接口 是代理类实现的一个接口。代理实例 是代理类的一个实例。 每个代理实例都有一个关联的调用处理程序 对象,它可以实现接口 InvocationHandler。通过其中一个代理接口的代理实例上的方法调用将被指派到实例的调用处理程序的 Invoke 方法,并传递代理实例、识别调用方法的 java.lang.reflect.Method 对象以及包含参数的 Object 类型的数组。调用处理程序以适当的方式处理编码的方法调用,并且它返回的结果将作为代理实例上方法调用的结果返回。

 

测试代码如下:
一个接口:MyInterface

public interface MyInterface {
public void print();
public void test(int num);
}

 

实现以上接口的类:MyTest

public class MyTest implements MyInterface{
public void print(){
    System.out.println("MyTest print");
}
public void test(int num){
    System.out.println(num);
}
}

 


处理类:MyTestHandler

public class MyTestHandler implements InvocationHandler {

    private MyInterface mytest = null;

    public MyInterface bind(MyInterface test) { //注意传递的参数类型是接口,而不是实现类
        this.mytest = test;
        MyInterface proxyTest = (MyInterface) Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), this);
        return proxyTest;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //具体的处理策略,根据方法名判断
        Object obj = null;
        if ("print".equals(method.getName())) {
            System.out.println("got it");
        } else if ("test".equals(method.getName())) {
            int num = (Integer)args[0];
            System.out.println(num+2);
        } else {
            obj = method.invoke(mytest, args);  //交给目标对象处理
        }
        return obj;
    }
}

 

测试类:Main

public class Main {
public static void main(String args[]){
MyTest test = new MyTest();
MyTestHandler handler = new MyTestHandler();
MyInterface proxy = handler.bind(test);//绑定方法返回对象的代理,以后可以操作该代理,隐藏了实际的对象
proxy.test(3);
}
}
 



分析:
    通过对代理类的调用,代替了对实际类MyTest的调用,在invoke方法中,可以截获对方法的调用,针对特定的策略采取相应的措施。无需特殊处理的话,还是调用实际的对象的方法。

补充:
摘自jdk文档:

Proxy的静态方法:

写道
newProxyInstance
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。此方法相当于:
Proxy.getProxyClass(loader, interfaces).
getConstructor(new Class[] { InvocationHandler.class }).
newInstance(new Object[] { handler });
 

 

资源下载链接为: https://pan.quark.cn/s/dab15056c6a5 用户画像(User Profile)是大数据领域关键概念,是基于用户多维度信息如行为数据、偏好、习惯等构建的虚拟代表。它是数据分析重要工具,能助企业深度理解用户,实现精准营销、个性化推荐及服务优化。其源码涵盖以下内容:一是数据收集,需大量数据支撑,常借助Flume、Kafka等日志收集系统,实时或批量收集用户浏览记录、购买行为、搜索关键词等数据;二是数据处理与清洗,因数据源杂乱,需用Hadoop、Spark等大数据处理框架预处理,去除噪声数据,统一格式,保障数据质量;三是特征工程,为构建用户画像关键,要挑选有意义特征,像用户年龄、性别、消费频率等,且对特征编码、标准化、归一化;四是用户聚类,用K-means、DBSCAN等算法将用户分组,找出行为模式相似用户群体;五是用户建模,借助决策树、随机森林、神经网络等机器学习模型对用户建模,预测其行为或需求;六是用户画像生成,把分析结果转为可视化用户标签,如“高消费能力”、“活跃用户”等,方便业务人员理解。 其说明文档包含:一是项目背景与目标,阐述构建用户画像原因及期望效果;二是技术选型,说明选用特定大数据处理工具和技术栈的理由;三是数据架构,描述数据来源、存储方式(如HDFS、数据库)及数据流图等;四是实现流程,详述各步骤操作方法和逻辑,含代码解释及关键函数功能;五是模型评估,介绍度量用户画像准确性和有效性方式,像准确率、召回率、F1分数等指标;六是应用场景,列举用户画像在个性化推荐、广告定向、客户服务等实际业务中的应用;七是注意事项,分享开发中遇问题、解决方案及优化建议;八是结果展示,以图表、报表等形式直观呈现用户画像成果,展现用户特征和行为模式。 该压缩包资源对学习实践用户画像技术价值大,既可助人深入理解构建过程,又能通过源码洞察大数据处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值