美文网首页
Java反射与动态代理

Java反射与动态代理

作者: Bloo_m | 来源:发表于2016-11-28 17:12 被阅读0次

Java反射

Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制

特点:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
对于任意一个对象,都能够调用它的任意一个方法和属性
主要功能:
(1)在运行时判断任意一个对象所属的类
(2)在运行时构造任意一个类的对象。
(3)在运行时判断任意一个类所具有的成员变量和方法。
(4)在运行时调用任意一个对象的方法
获取类Class对象:
**A.class **:不会加载类,也不会执行静态代码段;
**Class.forName("cn.test.reflect.A") **:要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段;
**new A().getClass() **:通过对象获取class
反射创建对象:
通过默认构造函数创建对象:Class<?> t = Class.forName("cn.test.reflect.A"); t.newInstance();
通过指定构造函数创建对象:Class<?> t = Class.forName("cn.test.reflect.A"); Constructor<?> cons[] = t.getConstructors(); A a = (A) cons[2].newInstance("aa","bb");
Class类常用方法:
**getName() **:获得类的完整名字;
**getSuperclass() **:获得类的父类;
newInstance() :通过类的不带参数的构造方法创建这个类的一个对象;
getFields() :获得当前类和父类中的public类型的所有属性;
getDeclaredFields() :获得当前类(不包含父类)声明的所有属性,包括private和public;
注:对于某个属性field,设置field.setAccessible(true),即可访问private的属性值,如field.get(obj)
getMethods() :获得前类和父类中public类型的所有方法
**getDeclaredMethods() **:获得当前类(不包含父类)声明的所有方法,包括private和public;
**getMethod(String name, Class[] parameterTypes) **:获得类的指定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型;
getConstructors() :获得当前类的public类型的构造方法;
getDeclaredConstructors() :获得当前类的public和private类型的构造方法;
**getConstructor(Class[] parameterTypes) **:获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型;
**getInterfaces() **:获得实现的接口;
getSuperclass() :获得继承的父类;

Java动态代理

java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的耦合性

JDK动态代理

JDK动态代理中包含一个类和一个接口,即Proxy类和InvocationHandler接口。
1) InvocationHandler接口:
public interface InvocationHandler {   
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; }
参数说明:① Object proxy:指被代理的对象;② Method method:要调用的方法;③ Object[] args:方法调用时所需要的参数;
2) Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
参数说明:① ClassLoader loader:类加载器;② Class<?>[] interfaces:得到全部的接口;③ InvocationHandler h:得到InvocationHandler接口的子类实例 ;
3) 关于类加载器
在Proxy类中的newProxyInstance()方法中需要一个ClassLoader类的实例,ClassLoader实际上对应的是类加载器,在Java中主要有以下三种类加载器:
① Booststrap ClassLoader:此加载器采用C++编写,通常加载jre/lib/rt.jar,一般开发中是看不到的;
② Extendsion ClassLoader:用来进行扩展类的加载,通常加载jre/lib/ext/*.jar;
③ AppClassLoader:(默认)加载classpath指定的类,是最常使用的是一种加载器;

Cglib动态代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
动态代理的步骤
(1).创建一个实现接口InvocationHandler的类,它必须实现invoke方法
(2).创建被代理的类以及接口
(3).通过Proxy的静态方法
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 创建一个代理
(4).通过代理调用方法

相关文章

  • Java基础:反射

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

  • 安卓反射和动态代理的应用

    提纲 java反射基础 反射在Android中的应用 Java动态代理 动态代理在Android的应用 java反...

  • 一文带你搞懂Java反射和动态代理

    分享 Java反射和动态代理

  • Java 动态代理

    前言 关于动态代理 JDK动态代理 CGLIB动态代理 区别 java动态代理是利用反射机制生成一个实现代理接口的...

  • Java反射机制详解(二)

    本篇文章继续介绍Java反射机制,不同的是侧重于介绍动态代理。动态代理是代理模式中的一种,是通过Java反射机制来...

  • Java反射机制总结(二)

    本篇文章继续介绍Java反射机制,不同的是侧重于介绍动态代理。动态代理是代理模式中的一种,是通过Java反射机制来...

  • 快速上手 Kotlin 开发系列之动态代理

    本节介绍 Kotlin 中没有反射的动态代理。 Java 中的动态代理 在讲 Kotlin 的动态代理之前先简单回...

  • Java反射与动态代理

    Java反射 Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制 特点:...

  • Java反射与动态代理

    代理模式 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活 中...

  • 2021校招 复习总结

    笔记导航: JAVA: 泛型 反射和动态代理 注解 JAVA多线程 ReentrantLock,Volatile,...

网友评论

      本文标题:Java反射与动态代理

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