java动态代理

一、简单实现:

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");
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

Python网络爬虫之正则表达式

正则表达式非Python独有,在Python中通过re库模块实现。 ? 下面是一些常见的匹配模式 ? re.match re.match尝试从字符串的起始位置匹...

18610
来自专栏PHP在线

欢迎来到phpdaily

1.Null类型,表示空对象指针,使用typeof检测会返回object。 如果定义的变量在将来用于保存对象,最好将该变量初始化为NUll.可以体现null作为...

3277
来自专栏WD学习记录

C#学习笔记(五)

简单的按照成员副职对象可以通过派生于System.Object的MemberwiseClone()方法来完成。这是一个受保护的方法,但很容易在对象上定义一个调用...

631
来自专栏深度学习之tensorflow实战篇

hive字符串函数

hive字符串函数 1. 字符串长度函数:length 语法: length(string A) 返回值: int 说明:返回字符串A的长度 举例:hive> ...

7757
来自专栏猿人谷

C++重要知识点小结---2

C++重要知识点小结--1 :http://www.cnblogs.com/heyonggang/p/3246631.html 1.C++允许程序员声明一个不能...

2047
来自专栏nummy

JS遍历属性

对象属性可枚举,表示该属性的值不可修改,可认为该属性是常量。 如何定义不可枚举的属性?

1432
来自专栏ml

关于如何来构造一个String类

  今天帮着一位大二的学弟写了一个String的类,后来一想这个技术点,也许不是什么难点,但是还是简单的记录一些吧! 为那些还在路上爬行的行者,剖析一些基本的实...

3735
来自专栏GreenLeaves

JavaScript之面向对象学习七(动态原型模式、寄生构造函数模式、稳妥构造函数模式创建自定义类型)

一、动态原型模式 在面向对象学习六中的随笔中,了解到组合构造函数模式和原型模式创建的自定义类型可能最完善的!但是人无完人,代码亦是如此! 有其他oo语言经验的开...

23410
来自专栏一直在跳坑然后爬坑

Kotlin之“AbstractMutableList”

打印结果分别为 prefix1:2:3:4:5:6postfix prefix1:2:3:truncatedpostfix

1622
来自专栏拭心的安卓进阶之路

深入理解 Java 反射:Class (反射的入口)

深入理解 Java 反射系列: 深入理解 Java 反射:Class (反射的入口) 深入理解 Java 反射:Field (成员变量) 深入理解 Java ...

26110

扫码关注云+社区

领取腾讯云代金券