类的加载机制和反射——五、使用反射生成JDK动态代理

使用反射生成JDK动态代理

1.使用Proxy和InvocationHandler创建动态代理

(1)Proxy提供了用于创建动态代理类和动态代理对象的静态方法,他也是所有动态代理类的父类。

(2)如果在程序中为一个或多个接口动态的生成实现类,就可以使用Proxy来创建动态代理类,如果需要为一个或多个接口动态的创建实例,也可以使用Proxy来创建动态代理实例。

(3)Proxy提供了两个方法来创建动态代理类和动态实例:

  1)static Class<?> getProxyClass(ClassLoader loader,Class<?>...interface):

    创建一个动态代理类所对应的Class对象,该代理类将实现interface所指定的多个接口。第一个               ClassLoader参数指定生成动态代理类的类加载器;

  2)static Object newProxyInstance(ClassLoader laoder,Class<?>[] interface,InvocationHandler h):

    直接创建一个动态代理对象,该代理对象的实现类实现了interface指定的系列接口,执行代理对象的每个         方法时都会被替换执行InvocationHandlerd对象的invoke方法;

(4)使用Proxy和InvocationHandler生成动态代理对象

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

//定义一个接口
interface Person{
    void walk();
    void sayHello(String name);
}
//实现InvocationHandler接口的类
class MyInvocationHandler implements InvocationHandler{
    /*
     * 执行动态代理的所有方法时,都会被替换成如下的invoke方法
     * proxy——动态代理对象
     * method——正在执行的方法
     * args——调用目标方法时所传入的参数
     */
    //InvocationHandler中所需实现的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("正在执行的方法:"+method);
        if(args!=null){
            System.out.println("下面是执行该方法时传入的参数:");
            for(Object val:args){
                System.out.println(val);
            }
        }else{
            System.out.println("调用该方法没有实参!");
        }
        return null;
    }

}
public class ProxyTest {
    public static void main(String[] args)throws Exception{
        //创建一个InvocationHandler对象
        InvocationHandler handler = new MyInvocationHandler();
        //使用指定的InvocationHandler来生成一个动态代理对象
        Person p = (Person)Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler);
        //调用动态代理对象的方法
        p.walk();
        p.sayHello("aaa");
    }
}

2.动态代理和AOP

  用于方便代码的复用以及后期修改(暂时想到的)。

时间: 2024-12-29 23:24:21

类的加载机制和反射——五、使用反射生成JDK动态代理的相关文章

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

深入java虚拟机学习 -- 类的加载机制(续)

昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: class Singleton { private static Singleton singleton = new Singleton(); //第一份代码的位置 public static int counter1; public static int counter2=0; private s

Java反射—运用反射生成jdk动态代理

1.  核心类&接口 在Java的java.lang.reflect包下提供一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成jdk动态代理类或动态代理对象. Proxy是所有动态代理类的父类,它提供了两个静态方法来创建动态代理类和动态代理对象,如下: ?  static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) ?  static Objec

类的加载机制和反射——一、类的加载、连接和初始化

类的加载.连接和初始化 1.JVM和类 (1)当调用java命令运行某个Java程序时,该命令会启动一个Java虚拟机进程,不管该Java程序有多么复杂,该程序启动了多少线程,他们都处于该Java虚拟机进程里. (2)同一个JVM的所有线程.所有变量都处于同一个进程里,他们都使用该JVM进程的内存区. 下面的ATast1和ATest2的输出结果分别是7和6,因为这两个不是位于同一个JVM中的. public class A { //定义该类的类变量 public static int a = 6

Java温故而知新(10)类的加载机制

类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类加载机制的第二个目的是让程序能动态的控制类加载,比如热部署等,提高程序的灵活性和适应性. 1.类加载机制 我们来了解一下虚拟机如何加载Class文件. 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被直接使用的java类型,这就是虚拟机的类加载机制. 类的生命周期包括加载(Loading).验证(Verification).准

java类的加载机制

文章来源: 转载自纯洁的微笑 原文链接:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不

初识jvm-1.Java类的加载机制

转载: jvm系列---纯洁的微笑 地址: http://www.ityouknow.com/jvm.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个类被"首次主

JVM:java类的加载机制

原文连接:https://www.cnblogs.com/ityouknow/p/5603287.html 类加载机制的奥妙. 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到

类的加载机制

ClassLoader Java程序并不是一个原生的可执行文件,而是由许多独立的类文件组成,每一个文件对应一个Java类.此外,这些类文件并非立即全部装入内存的,而是根据程序需要装入内存.ClassLoader专门负责类文件装入到内存. 数组类的 Class 对象不是由类加载器创建的,而是由 Java 运行时根据需要自动创建.数组类的类加载器由 Class.getClassLoader() 返回,该加载器与其元素类型的类加载器是相同的:如果该元素类型是基本类型,则该数组类没有类加载器. 从上图我