美文网首页
Java 代理

Java 代理

作者: 一颗北上广的心 | 来源:发表于2017-11-10 09:26 被阅读0次
  • 静态代理
package practice;

public class StaticProxyTest {

    public static void main(String[] args) {
        Proxy proxy = new Proxy(new HelloHanddler());
        proxy.handdle();
    }

    static class MyLogger {
        public static void before() {
            System.out.println("logger before");
        }

        public static void after() {
            System.out.println("logger after");
        }
    }

    // interface
    static interface Handdler {
        void handdle();
    }

    // the business class implements the interface
    static class HelloHanddler implements Handdler {

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

    }
    
    // the proxy class implements the interface
    static class Proxy implements Handdler {

        Handdler handdler;

        public Proxy(Handdler handdler) {
            this.handdler = handdler;
        }

        @Override
        public void handdle() {
            MyLogger.before();
            handdler.handdle();
            MyLogger.after();
        }

    }
}

  • 动态代理
package practice;

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

public class DynamicProxyTest {

    public static void main(String[] args) {
        Handdler handdler =(Handdler) new Proxy().bind(new HelloHanddler());
        handdler.handdle();
    }

    static class MyLogger {
        public static void before() {
            System.out.println("logger before");
        }

        public static void after() {
            System.out.println("logger after");
        }
    }

    // interface
    static interface Handdler {
        void handdle();
    }

    // the business class implements the interface
    static class HelloHanddler implements Handdler {

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

    }

}

// the proxy class implements dynamic interface
class Proxy implements InvocationHandler {

    Object target;

    public Object bind(Object object) {
        this.target = object;
        //返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
        return java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        DynamicProxyTest.MyLogger.before();
        Object result = method.invoke(target, args);
        DynamicProxyTest.MyLogger.after();
        return result;
    }

}

  • 动态代理, 日志切片使用反射获得方法
package practice;

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

public class DynamicProxyTest {

    public static void main(String[] args) {
        Handdler handdler = (Handdler) new Proxy().bind(new HelloHanddler(), new MyLogger());
        handdler.handdle();
    }

    // interface
    static interface Handdler {
        void handdle();
    }

    // the business class implements the interface
    static class HelloHanddler implements Handdler {

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

    }

}

class MyLogger {
    public void before() {
        System.out.println("logger before");
    }

    public static void after() {
        System.out.println("logger after");
    }
}

// the proxy class implements dynamic interface
class Proxy implements InvocationHandler {

    Object target;

    Object logger;

    public Object bind(Object object, Object logger) {
        this.target = object;
        this.logger = logger;
        // 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
        return java.lang.reflect.Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Class clz = logger.getClass();
        Method before = clz.getMethod("before", null);
        Method after = clz.getMethod("after", null);

        before.invoke(logger, null);// invoke non static method
        Object result = method.invoke(target, args);
        after.invoke(null, null); // invoke static method

        return result;
    }

}

  • 动态代理, 自定义注解(对注解的方法,使用动态代理添加切片逻辑)
package proxy;

public interface IPlan {

    @Visit()
    public void visit();

}
package proxy;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Visit {

}
package proxy;

public class PlanDalian implements IPlan{

    @Override
    public void visit() {
        System.out.println("What a beautiful city.");
    }

}
package proxy;

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

public class VisitProxy implements InvocationHandler {

    Object target;

    public Object bind(Object obj) {
        this.target = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getAnnotations() == null || method.getAnnotations().length == 0) {
            return method.invoke(target, args);
        }

        Object result = null;
        for (Annotation annotation : method.getAnnotations()) {
            if (annotation instanceof Visit) {
                System.out.println("Welcome");
                result = method.invoke(target, args);
                System.out.println("bye");
                return result;
            } else {
                continue;
            }
        }

        return method.invoke(target, args);
    }

}

package proxy;

public class Main {

    public static void main(String[] args) {
        IPlan plan =(IPlan) new VisitProxy().bind(new PlanDalian());
        plan.visit();
    }

}

相关文章

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • Java 中的HTTP/Socks代理设置

    在内网环境,有些时候需要设置Java代理,常见的有HTTP(s)代理和Socks代理,如何设置代理,Java 可以...

  • 代理简记

    Java静态代理 委托类和代理类,实现共同接口 共同接口: 委托类: 代理类: 测试结果: Java动态代理 通过...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • java | 什么是动态代理?

    最近在复习 Java 相关,回顾了下代理模式。代理模式在 Java 领域很多地方都有应用,它分为静态代理和动态代理...

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

网友评论

      本文标题:Java 代理

      本文链接:https://www.haomeiwen.com/subject/cvgpmxtx.html