java 反射之静态and动态代理

首先说一下我们什么情况下使用代理?

(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。

(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
---------------------

一,静态代理

package org.rcisoft.business.reflectDemo;

/**
 * @author: wsj
 * @date: 2018/10/13
 * @time: 18:18
 */
//静态代理
//接口
public interface StaticReflect {
    void show();
}
//被代理类
class Nike implements StaticReflect{
    @Override
    public void show() {
        System.out.println("nike开始生产衣服...");
    }
}
//代理类
class ProxyClass implements StaticReflect{
    StaticReflect sr;

    public ProxyClass(StaticReflect st){
        this.sr = st;
    }
    @Override
    public void show() {
        System.out.println("代理类开始执行,收代理费$10");
        sr.show();
    }
}

class testStaticReflect{
    public static void main(String[] args) {
        Nike nick = new Nike();
        ProxyClass proxyClass = new ProxyClass(nick);

        proxyClass.show();
    }
}

二,动态代理

package org.rcisoft.business.reflectDemo;

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

/**
 * @author: wsj
 * @date: 2018/10/13
 * @time: 18:42
 */

public interface ProxyTest {

}
//反射之动态代理
//接口
interface Subject{
    void action();
}
//被代理类
class RealSubject implements Subject{
    @Override
    public void action() {
        System.out.println("动态被代理类开始执行啦!...");
    }
}
//代理类
class MyInvocationHandler implements InvocationHandler {
    Object obj; //实现了被代理类的对象的说明

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

    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws InvocationTargetException, IllegalAccessException {
        return method.invoke(obj, args);
    }
}
class testProxyMethod{
        public static void main(String[] args) {
            RealSubject realSubject = new RealSubject();
            MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
            Subject subject = (Subject) myInvocationHandler.blind(realSubject);
            realSubject.action();
        }
    }

原文地址:https://www.cnblogs.com/wsjun/p/9786189.html

时间: 2024-10-27 03:00:40

java 反射之静态and动态代理的相关文章

java反射机制中的动态代理

java反射机制中的动态代理 动态代理模式及其使用 步骤1:定义一个接口 //接口 interface Subject{ void action(); } 步骤2:定义一个接口的实现类,也就是被代理类 //被代理类 class RealSubject implements Subject { @Override public void action() { System.out.println("我是被代理类,请执行我"); } } 步骤3:定义一个实现InvocationHandle

java反射机制应用之动态代理

1.静态代理类和动态代理类区别 静态代理:要求被代理类和代理类同时实现相应的一套接口:通过代理类的对象调用重写接口的方法时,实际上执行的是被代理类的同样的 方法的调用. 动态代理:在程序运行时,根据被代理类及其实现的接口,动态的创建一个代理类.当调用代理类的实现的抽象方法时,就发起对被代理类同样方法的调用. 涉及到的技术点: ①提供一个实现了InvocationHandler接口实现类,并重写其invoke()方法 ②Proxy.newProxyInstance(obj.getClass().g

黑马程序员__反射_内省_动态代理

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 1.Class .class文件加载到内存中就是一个Class对象 获取Class对象的方式有3种: Scanner sc = newScanner("xxx.txt"); Class.forName(sc.nextL

java开发必学知识:动态代理

目录 1. 引言 2. 代理模式及静态代理 2.1 代理模式说明 2.2 静态代理 2.3 静态代理局限性 3. 动态代理 3.1 JAVA反射机制 3.2 JDK动态代理 3.2.1 JDK动态代理 3.2.2 JDK动态代理与限制 3.4 CGLIB动态代理 4. 动态代理在Spring的应用:AOP 4.1 AOP 概念 4.2 AOP编程 4.2.1 引入aop依赖 4.2.2 定义切面.切点与通知 5. 总结 参考资料 往期文章 一句话概括:java动态代理通过反射机制,可在不修改原代

关于java的一个典型的动态代理

今天看书的一个过程中,看到一个动态代理看下代码 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy { public static void testDynamicProxy(){ Calculator calculator = new CalculatorImpl(); LogH

Java学习之:JDK动态代理与CGLIB动态代理

代理的概念:简单的理解就是通过为某一个对象创建一个代理对象,我们不直接引用原本的对象,而是由创建的代理对象来控制对原对象的引用. 动态代理:是指在程序运行时由Java反射机制动态生成,无需手动编写代码.动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类. 代理原理:代理对象内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作

java字节码生成与动态代理的实现

一.代码生成的例子 java中的javac命令就是字节码生成的“老祖宗”,并且它也是用java写的.还有Web 中的jsp编译器,编译时植入的AOP框架,还有很常用的动态代理,甚至在反射时JVM也有可能在运行时生成字节码来提高速度. 如果使用过Spring来做Bean的管理 ,那么就使用过动态代理,因为如果 Bean是面向接口的编程,那么在Spring内部都是通过 动态代理的方法来对Bean进行增强的. 二.例子 package com.company; import java.lang.ref

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调

Java开发纯接口的动态代理

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 相关类及接口 java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象.// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器static InvocationHandler getInvocationHandler(Object pr