前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java动态代理

java动态代理

作者头像
曼路
发布2018-10-18 15:16:33
3930
发布2018-10-18 15:16:33
举报
文章被收录于专栏:浪淘沙

一、简单实现:

代码语言:javascript
复制
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

代码语言:javascript
复制
public interface UserService {
    public void add();
}

二、UserServiceImpl.java

代码语言:javascript
复制
public class UserServiceImpl implements UserService{

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

}

三、 ProxyTool.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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(用于增强)

代码语言:javascript
复制
public class MyAdvice {
    public  void open() {
        System.out.println("open");
    }
    public  void close() {
        System.out.println("close");
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档