Java动态代理---动态类Proxy的使用

代理模式
 
 简介:
    不直接操作实际的对象,而是通过代理对象间接操作实际对象,具体使用者不知道操作的具体
    对象还是实际对象。

静态代理

1、例
  1)、被代理类
          package demo3;
        public class AA {
        
            public void method(){
                System.out.println("adfadf");
            }
        }
  2)、代理类
        public class BB {
            private Object aa;
            public BB(Object aa) {
                super();
                this.aa = aa;
            }
            public Object getAa() {
                return aa;
            }
        }
        
  3)、测试
      package demo3;
    public class Example {
    
        public static void main(String[] args) {
            AA aa=new AA();
            BB bb=new BB(aa);
            ((AA)(bb.getAa())).method();
        }
    }

Java动态代理---动态类Proxy的使用
    
1、被代理类接口
package demo2;
public interface IA {

public String method1(String str,String str1);
    public void method2();
}

2、被代理类
package demo2;
public class A implements IA{

@Override
    public String method1(String str,String str1) {
        System.out.println("method1------"+str+"------"+str1);
        return str1;
    }

@Override
    public void method2() {
        System.out.println("method2");
    }
}

3、代理类
package demo2;

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

public class HandleProxyA implements InvocationHandler {

private IA ia;
    
    public HandleProxyA(IA ia) {
        super();
        this.ia = ia;
    }

/**
     * @param proxy:被代理类
     * @param method :被代理类方法
     * @param args :被代理类方法 方法列表
     * @return 返回值为被代理类方法返回值
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        if(args!=null){
            for (int i = 0; i < args.length; i++) {
                System.out.println(args[i]);
            }
        }
        Object result = method.invoke(ia, args);
        
        System.out.println(result);
        
        return result;
    }
}

4、实例
      package demo2;

import java.lang.reflect.Proxy;
    
    public class Example {
    
        public static void main(String[] args) {
            
            IA ia=new A();//被代理
            HandleProxyA proxyA=new HandleProxyA(ia);//代理
            //创建动态代理对象
            IA ia2 = (IA) Proxy.newProxyInstance(ia.getClass().getClassLoader(),ia.getClass().getInterfaces(), proxyA);
            ia2.method1("asdfad","245245");
            ia2.method2();
        }
    }

时间: 2024-10-02 03:43:32

Java动态代理---动态类Proxy的使用的相关文章

动态代理之JDK Proxy浅析

反射:运行时动态实例化任何一个类. 看此文章前至少对JAVA反射有一定了解... Jdk动态代理的实现就是使用了反射机制,关键代码在Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h).可以看到该方法中的最后一个参数InvocationHandler,这是动态代理实现的另一个关键点. 直接上代码,接口.目标类.调用处理类: /** * @author longe * 目标类实现的

java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档) java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口. invoke()在代理实例上处理方法调用并返回结果.在与方法关联的代理

探索Mybatis之JDK动态代理:探究Proxy.newProxyInstance()生成的代理类解析

Mybatis的Mapper接口UserMapper 1 package com.safin.Mapper; 2 3 import com.safin.Pojo.User; 4 5 import java.util.List; 6 7 public interface UserMapper { 8 int insertUser(User user); 9 User getUser(Long id); 10 List<User> findUser(String userName); 11 } 我

动态代理工具类

我刚刚想着每次写动态代理的时候都会写非常多的代码,有点不值得,所以我写了一个实现动态代理的工具类.用户能够用JDK动态代理也能够使用CGLIB动态代理,我的ProxyUtils中提供了三种开发动态代理的方式.在实际用的过程中,能够继承Intercepter这个抽象类实如今逻辑代码前后加入控制代码.假设控制代码返回true那么证明能够通过,假设控制代码返回false说明验证不通过,假设不通过那么就返回你逻辑代码中返回的"0"值,假设你逻辑代码返回对象.那么会返回null,假设是其它类型则

啰里吧嗦式讲解java静态代理动态代理模式

一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于是遇到了动态代理这个大坑, 写博客等于是对自己学习过程的一个回顾和总结 本文主要参考欧阳锋的10分钟看懂动态代理设计模式 二.理解和弄懂代理的前期准备 2.1.什么是代理 简单来说就是有活不自己干,让别人干, 比如你不想写作业, 让同学帮你写,然后写上自己的名字, 这个同学就是你的代理, 帮你处理一

Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术

目标对象的所有接口方法 package test.spring.service; public interface PersonService { public String getPersonName(Integer id); public void save(String name); } 目标对象 package test.spring.service.impl; import test.spring.service.PersonService; //代理对象实现目标对象所有接口 publ

Java接口-----代理模式(Proxy)

public static void main(String[] args) { // TODO Auto-generated method stub ProxySubject a = new ProxySubject(); a.request(); }} interface Subject                                                            //代理请求 { abstract public void request(); } c

jdk 动态代理 数据连接池

package com.itheima.datasource; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayL

43、Java动态代理一——动态类Proxy的使用

1.什么是动态代理? 答:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实.代理一般会实现它所表示的实际对象的接口.代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象.客户不知道它是与代理打交道还是与实际对象打交道.2.为什么使用动态代理? 答:因为动态代理可以对请求进行任何处理 3.使用它有哪些好处? 答:因为动态代理可以对请求进行任何处理4.哪些地方需要动态代理? 答:不允许直接访问某些类:对访问要做特殊处理等 目前J