文章目录

  • 反射、代理
    • 1 反射
    • 2 静态代理
    • 3 动态代理

反射、代理

1 反射

反射机制可以用于动态操作Java代码,能够知道任意一个类的属性和方法,能够调用任意一个对象的属性和方法

优点:运行时根据类型判断,动态加载类,提高代码灵活度

缺点:性能会慢一些,动态操作类增加了安全隐患

获取Class类

// 通过类获取
Class c = XXX.class;
// 通过对象实例获取
XXX xxx = new XXX();
Class c = xxx.getClass();
// 传入类的路径
Class c = Class.forName("com.xxx.XXX");
// 传入类的路径
Class c = ClassLoader.LoadClass("com.xxx.XXX");

获取属性和方法

class Student {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}public class Main {public static void main(String[] args) {Student student = new Student();Class studentClass = student.getClass();// 获取所有声明的方法Method[] methods = studentClass.getDeclaredMethods();for (Method method : methods) {System.out.println(method.getName());}// 获取类的属性try {Field field = studentClass.getDeclaredField("name");field.setAccessible(true);  // 可以操作私有属性,取消安全检查field.set(student, "123");} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}System.out.println(student.getName());// 获取类的方法try {Method method = studentClass.getDeclaredMethod("setName", String.class);method.invoke(student, "456");} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}System.out.println(student.getName());}
}

2 静态代理

代理模式是使用代理对象来代替对真实对象操作,可用于扩展额外的功能

静态代理中,对目标对象每个方法的增强都是手动完成的,被代理对象与代理对象实现相同的接口

静态代理在编译时就将接口、实现类、代理类都变成了实际的class文件

public interface IUserDao {void save();
}public class UserDao implements IUserDao {public void save() {System.out.println("----已经保存数据!----");}
}public class UserDaoProxy implements IUserDao{//接收保存目标对象private IUserDao target;public UserDaoProxy(IUserDao target){this.target=target;}public void save() {System.out.println("开始事务...");target.save();//执行目标对象的方法System.out.println("提交事务...");}
}

3 动态代理

动态代理在运行时动态生成类字节码,并加载到JVM中

所有的代理类都扩展于Proxy类,一个代理类只有一个实例域——调用处理器

所有的代理类都覆盖了Object类中的方法toString、equals、hashCode

代理类一定是public和final

public class ProxyFactory{//维护一个目标对象private Object target;public ProxyFactory(Object target){this.target=target;}//给目标对象生成代理对象public Object getProxyInstance(){return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开始事务2");//执行目标对象方法Object returnValue = method.invoke(target, args);System.out.println("提交事务2");return returnValue;}});}}

Java基础(三)——反射、代理相关推荐

  1. 重学JAVA基础(三):动态代理

    1.接口 public interface Hello {public void sayHello(); } 2.实例类 public class Hello2 {public void sayHel ...

  2. Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,动态创建一组指定的接口的实现类对象(代理对象)! 代理是实现AOP(面向切面编程)的核 ...

  3. Java的三种代理模式完整源码分析

    Java的三种代理模式&完整源码分析 Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCach ...

  4. Java的三种代理模式【附源码分析】

    Java的三种代理模式&完整源码分析 代理模式分为两种,静态代理和动态代理,动态代理包括JDK动态代理和Cglib动态代理. 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理 ...

  5. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  6. 学习spring必须java基础知识-动态代理

    2019独角兽企业重金招聘Python工程师标准>>> Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Jav ...

  7. 学习Spring必学的Java基础知识----反射

    引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...

  8. java基础之 反射_Java基础之反射原理与用法详解

    本文实例讲述了Java基础之反射原理与用法.分享给大家供大家参考,具体如下: 1.什么是反射? 反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx& ...

  9. Java基础之——动态代理

    动态代理 文章目录 动态代理 1.动态代理总括 1.1.★ 什么是动态代理 ? 1.2.★ 知道动态代理能做什么 ? 2.什么是代理? 3.★ 使用代理模式的作用 4.代理的分类 5.★代理类的功能 ...

  10. Java基础之—反射(非常重要)

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

最新文章

  1. 以太坊经典成为第六个加密货币
  2. linux查看进程相关命令
  3. 局域网有几台电脑频繁断网_如何实现几台电脑同步共享资料文件?——用JASTVIN私密云盘...
  4. 在html页面比较两个时间戳,如何比较C中的两个时间戳?
  5. 微服务中集成分布式配置中心 Apollo
  6. 《 Docker 技术入门与实战 》读书笔记 ( CentOS 安装 Docker )
  7. 计算机不能显示可移动磁盘咋办,U盘插上电脑不显示“可移动磁盘”该怎么办...
  8. elementui更改el-table表头背景颜色和字体颜色
  9. [动画工具] Animations
  10. Dockerfile 中 配置安装 php 扩展
  11. 计算机的组成 —— 鼠标
  12. 汇顶科技外包java_汇顶科技——好好掂一掂它的技术含量(只谈基本面)
  13. C++ 的异常处理解答
  14. 失败的人只有一种,就是在抵达成功之前放弃的人
  15. 如何救队友_PS4《高达EXVSMBON》:如何违抗拥有巴力的他?
  16. Kinect开发教程八:OpenNI2显示深度、彩色及融合图像
  17. jmeter测试mysql数据库_【JMeter】JMeter完成一个MySql压力测试
  18. laravel框架操作数据库
  19. 做教学直播时,如何做PPT课件直播?
  20. 使用华为modelarts进行车辆识别

热门文章

  1. root用户安装的软件在普通用户不生效
  2. ubuntu16.04中IDEA无法输入中文问题
  3. 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) C. XOR Equation 数学
  4. Shader中求一个以原点为起点的向量与x正方向的夹角的一个方法
  5. 读书笔记--Head First Programming 目录
  6. 我的网站之一(搭建网站架构)
  7. 【翻译】五步快速使用LINQPad尝鲜StreamInsight
  8. 在类库文件无法使用Server.MapPath
  9. zbb20180929 thread 自旋锁、阻塞锁、可重入锁、悲观锁、乐观锁、读写锁、对象锁和类锁...
  10. 一些科研中经常用到的工具