java动态代理

本文介绍Java动态代理的基本原理及其实现过程,通过两个实例详细展示了如何利用Java反射机制创建动态代理对象,包括简单的代理实现和较为复杂的代理模式,后者还涉及到了AOP思想的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简单实现:

package Demo;

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

public class test1 {
    public static void main(String[] args) {
        Person p = new Student();

        Class[] interfaces = {Person.class};
        Person person = (Person) Proxy.newProxyInstance(test1.class.getClassLoader(), interfaces, new InvocationHandler() {

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // TODO Auto-generated method stub
                System.out.println("加油");
                p.test();
                p.love();
                return null;
            }
        });
        person.love();//根据内部写的方法显示结果,不论外部调用谁,结果一样
    }
}


interface Person {
    public void test();
    public void love();
}

class Student implements Person{

    @Override
    public void test() {
        // TODO Auto-generated method stub
        System.out.println("努力努力再努力");
    }

    @Override
    public void love() {
        // TODO Auto-generated method stub
        System.out.println("i love you ");
    }



}

二、较复杂
 动态代理的步骤:

      1. 首先获得一个被代理对象的引用,

      2. 获得该引用的接口

      3. 生成一个类,这个类实现了我们给的代理对象所实现的接口

      4. 上述类编译生成了.class字节码供JVM使用

      5. 调用上述生成的class
UserService.java 是接口
UserServiceImpl.java是被代理对象 实现了UserService
ProxyTool.java 是代理类
Test.Java测试类

一、UserService.java

public interface UserService {
    public void add();
}

二、UserServiceImpl.java

public class UserServiceImpl implements UserService{

    public void add() {
        // TODO Auto-generated method stub
        System.out.println("hah");
    }

}

三、 ProxyTool.java

public class ProxyTool implements InvocationHandler{
    //被代理对象
    Object targer ;
    //增强类
    Object advice ;
    public ProxyTool(Object targer, Object advice) {
        super();
        this.targer = targer;
        this.advice = advice;
    }
    public ProxyTool() {
        super();
        // TODO Auto-generated constructor stub
    }

    public  Object getProxy() {
        return Proxy.newProxyInstance(ProxyTool.class.getClassLoader(), targer.getClass().getInterfaces(),this) ;
    }
    public  Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // TODO Auto-generated method stub

            Method[] m = advice.getClass().getMethods();
            for (Method method2 : m) {
                String name1 = method.getName();
                String name2 = method2.getName();
                if(name1.equals("add")) {
                if(name2.equals("open")) {
                    method2.invoke(advice, args);
                }
            }
            }
            Object obj = method.invoke(targer, null);
            return obj;
        }   
}

四、Test.Java

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        ProxyTool tool = new ProxyTool( new UserServiceImpl(),new MyAdvice());
        UserService proxy = (UserService) tool.getProxy();
        proxy.add();
    }

}

五、MyAdvice.java(用于增强)

public class MyAdvice {
    public  void open() {
        System.out.println("open");
    }
    public  void close() {
        System.out.println("close");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值