JVM,反射与动态代理

校招准备:(二):java高级知识(反射,动态代理,java和jvm内存模型,垃圾回收,类加载) 目录 3.1深入理解Java类型信息(Class对象)与反射机制 3.2、java的反射机制 3.3代理模式,静态代理,动态代理 3.3java注解的原理(拓展) 3.4java动态代理和cglib动态代理区别,Spring aop与aspectJ的区别: 4.jmm(javamemory model)内存模型与垃圾回收: 4.1java四种引用: 4.2深入理解JVM(一)--... 阅读详情

JavaVM,反射与动态代理

 

Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。

 

Java虚拟机查找这些java对象:

java虚拟机根据class path来查找java对象,而虚拟机的class path又分为三层:

bootstrap:sun.boot.class.path

extension: java.ext.dirs

application: java.class.path

三个class path各有对应的classloader。由上而下形成父子关系

当程序中调用new指令,或者ClassLoader.load方法时。其顺序如下:

1.       首先查看application的classloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。

2.       首先查看extension的classloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。

3.       首先查看bootstrap的classloader中是否已有对应的class缓存,如果有则返回,并根据class分配内存。如果没有,接下一步。

4.       由bootstrap的classloader在其class path中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,接下一步。

5.       由extension的classloader在其class path中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,接下一步。

6.       由application的classloader在其class path中试图加载该class,如果有,则将该class放入cache中,并返回。如果没有,则抛出ClassNotFound的exception。

 

Java虚拟机加载这些java对象:

每个java虚拟机都在其启动时产生一个唯一的class heap,并把所有的class instance都分配在其中。其中每个类实例的信息又分两部分,fields域和methods域。每个类实例各自拥有fields,但同一个类的不同实例共享methods

 

反射

JVM对反射的处理

简单例子代码:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.InvocationTargetException;

import java.io.IOException;

 

public class Main {

    public static void main(String[] args){

        TempImpl t1 = new TempImpl("temp1");

        try {

            Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

            t1Talk.invoke(t1, null);

        } catch (NoSuchMethodException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        } catch (IllegalAccessException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        } catch (InvocationTargetException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }

        try {

            System.in.read();

        } catch (IOException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }

    }

}

复杂例子代码:

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.InvocationTargetException;

import java.io.IOException;

 

public class Main {

    public static void main(String[] args){

        TempImpl t1 = new TempImpl("temp1");

        TempImpl t2 = new TempImpl("temp2");

        Temp2 temp2 = new Temp2();

        try {

            Method t1Talk = t1.getClass().getMethod("Talk", new Class[0]) ;

            Method t2Talk = t2.getClass().getMethod("Talk", new Class[0]) ;

            t1Talk.invoke(t2, null);

            t2Talk.invoke(t1, null);

            if(t1Talk.equals(t2Talk)){

                System.out.println("equals");

            }

           else{

                System.out.println("not equals");

            }

            if(t1Talk==t2Talk){

                System.out.println("ref equals");

            }

           else{

                System.out.println("ref not equals");

            }

            t2Talk.invoke(temp2, null);

        } catch (NoSuchMethodException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        } catch (IllegalAccessException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        } catch (InvocationTargetException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }

        try {

            System.in.read();

        } catch (IOException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }

    }

}

 

分析:java虚拟机把每个methods当作一个执行单元。该执行单元带有两种签名:类签名和属性签名(public,static等)。 反射的第一步,验证签名的合法性。验证通过后,顺序执行该method中的指令,当需要访问类实例的fields和传入参数时,由虚拟机注入。

 

动态代理

Sun对动态代理的说明:

一个简单例子代码:

动态代理的内部实现——代码生成:

研究JDK源代码,发现在Proxy的sun实现中调用了sun.misc.ProxyGenerator类的generateProxyClass( proxyName, interfaces)方法,其返回值为byte[]和class文件的内存类型一致。于是做如下试验:

public class  ProxyClassFile{

       public static void main(String[] args){

              String proxyName = "TempProxy";

        TempImpl t = new TempImpl("proxy");

              Class[] interfaces =t.getClass().getInterfaces();

             

              byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

                  proxyName, interfaces);

        File f = new File("classes/TempProxy.class");

        try {

            FileOutputStream fos = new FileOutputStream(f);

            fos.write(proxyClassFile);

            fos.flush();

            fos.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        } catch (IOException e) {

            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.

        }

       }

}

运行该类,到class文件夹下,利用反编译技术,发现原来其采用了代码生产技术:

 

public interface Temp{

       public void Talk();

       public void Run();

}

import java.lang.reflect.*;

 

public final class TempProxy extends Proxy

    implements Temp{

 

    private static Method m4;

    private static Method m2;

    private static Method m0;

    private static Method m3;

    private static Method m1;

 

    public TempProxy(InvocationHandler invocationhandler)   {

        super(invocationhandler);

    }

 

    public final void Run()    {

        try {

            h.invoke(this, m4, null);

            return;

        }

        catch(Error _ex) { }

        catch(Throwable throwable)  {

            throw new UndeclaredThrowableException(throwable);

        }

    }

 

    public final String toString(){

        try{

            return (String)h.invoke(this, m2, null);

        }

        catch(Error _ex) { }

        catch(Throwable throwable)  {

            throw new UndeclaredThrowableException(throwable);

        }

        return "";

    }

 

    public final int hashCode() {

        try {

            return ((Integer)h.invoke(this, m0, null)).intValue();

        }

        catch(Error _ex) { }

        catch(Throwable throwable){

            throw new UndeclaredThrowableException(throwable);

        }

        return 123;

    }

 

    public final void Talk(){

        try{

            h.invoke(this, m3, null);

            return;

        }

        catch(Error _ex) { }

        catch(Throwable throwable) {

            throw new UndeclaredThrowableException(throwable);

        }

    }

 

    public final boolean equals(Object obj) {

        try  {

            return ((Boolean)h.invoke(this, m1, new Object[] {

                obj

            })).booleanValue();

        }

        catch(Error _ex) { }

        catch(Throwable throwable) {

            throw new UndeclaredThrowableException(throwable);

        }

        return false;

    }

 

    static{

        try{

     m4 = Class.forName("Temp").getMethod("Run", new Class[0]);

     m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);

     m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);

     m3 = Class.forName("Temp").getMethod("Talk", new Class[0]);

     m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {

                Class.forName("java.lang.Object")

            });

        }

        catch(NoSuchMethodException nosuchmethodexception) {

            throw new NoSuchMethodError(nosuchmethodexception.getMessage());

        }

        catch(ClassNotFoundException classnotfoundexception) {

            throw new NoClassDefFoundError(classnotfoundexception.getMessage());

        }

    }

}

 

 

JVM学习指南(46)-JVM动态代理 动态代理是一种在运行时动态创建代理类的技术。与静态代理不同,静态代理需要在代码中明确定义代理类,而动态代理则不需要。动态代理可以在不修改原有代码的情况下,为一个或多个类添加额外的功能,这使得它在某些场景下非常有用。动态代理是一种强大的技术,它允许我们在运行时动态地为类添加功能。通过理解其原理和实现步骤,我们可以在实际开发中灵活地应用动态代理。同时,我们也应该注意到动态代理可能带来的性能开销和复杂性增加。希望这篇文章能帮助你更好地理解和使用JVM动态代理。 阅读详情

相关推荐

JVM技术,反射与动态代理

Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。

Java JVM生命周期、动态代理——Java JVM筑基

类加载器执行引擎。

qq_42544728的博客 789

正直摄影方式的精度估算式_利用BDS数据反演大气可降水量及其精度分析

可降水量(PWV)对中小尺度灾害性天气预报具有指示意义,是降雨强度预报的重要参数之一。自20世纪80、90年代起,国外已经对GPS探测大气可降水量进行了大量研究。国内最早由毛节泰引进并详细介绍了地基GPS反演大气可降水量的方法,近年来发展迅速并取得了一定的成果。随着中国北斗卫星导航系统(BDS)提供服务并不断地建设完善,其已经能够应用到气象学领域,可以获得大气可降水量。文献[11]利用...

weixin_39796752的博客 1246

JVM动态代理

JVM动态代理 使用java.lang.reflect.Proxy类动态的根据您指定的接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口;(您在参数中传入的接口数组) 然后再利用指定的classloader将 class byte加载进系统,最后生成这样一个类的实例,并初始化该对象的一些值,如invocationHandler,以及所有的接口对应的Metho...

qgbihc的专栏 425

【Python Turtle合集】有趣好玩的代码当然要分享给大家啦~(皮卡丘、玫瑰花、小黄人......)

前言 🚀 作者 :“程序员梨子” 🚀 **文章简介 **:本篇文章主要是写了利用Turtle库绘制四种不一样的图案的小程序! 🚀 **文章源码免费获取 : 为了感谢每一个关注我的小可爱💓每篇文章的项目源码都是无 偿分享滴💓👇👇👇👇 点这里蓝色这行字体自取,需要什么源码记得说标题名字哈!私信我也可! 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 正文 今天给大家介绍一个好玩儿的库,嘻嘻! Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵

TZ45678的博客 3万+

流量特征工程实战:基于Python脚本的CIC-FlowMeter批量自动化处理

本文详细介绍了如何利用Python脚本对CIC-FlowMeter工具进行批量自动化封装,实现从海量PCAP文件中高效提取流量特征并生成CSV文件。通过构建健壮的自动化流水线,解决了手动处理效率低下、易出错的问题,并分享了并行处理、错误处理等关键优化技巧,助力网络流量分析与机器学习数据预处理工作。

c6d7e8f9g的博客 744

jvm动态代理的原理和应用

动态代理是一种在运行时动态生成代理类的技术,它可以在不修改原始类的情况下,为其添加额外的功能或行为。通过动态生成一个代理类,该代理类实现了与原始类相同的接口,并且在方法调用前后插入了额外的逻辑。通过代理类,可以拦截对原始类方法的调用,并在调用前后执行自定义的逻辑。动态代理是一种在运行时动态生成代理类的技术,它可以在不修改原始类的情况下,为其添加额外的功能或行为。通过动态代理,我们可以在方法调用前后插入自定义的逻辑,实现对原始类的增强。通过动态代理,可以在方法调用前后插入切面逻辑,实现对关注点的统一处理。

互联网知识分享 445

集成电路设计笔记(七)UVLO设计

1. 什么是UVLO 欠压锁定(Undervoltage-Lockout)简称UVLO,是电子设备中在电源电压低于正常工程准位时,切断电源的电路。在嵌入式系统中常会用UVLO监控电池电压,若电压低于一定值,会直接切断电源,保护嵌入式系统的电路。 许多电子设备中都有UVLO的功能,例如在镇流器中就有UVLO电路,若电压过低时直接切断电源。 UVLO就是低电压锁定; 低压关断. 欠压关断模式是当供电电压低于IC的开启门限电压时的一种保护模式。欠压关断模式可保证IC在供电电压不足时不致于被损坏。一个低电压锁定(

ccbirds 2万+

【技术揭秘】JVM字节码生成与动态代理,如何让你的代码更高效?

你是否曾经好奇,那些高效的Java程序是如何实现的?它们背后的魔法是什么?今天,我们将一起揭开JVM字节码生成技术和动态代理的神秘面纱,让你的程序运行得更快、更智能!

LA1245780的博客 400

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

零基础学写《扫雷》游戏(Qt扫雷源码)

扫雷游戏是在windows系统中自带的游戏,他的游戏玩法其实很简单,20世纪初期电脑上没有啥游戏可以玩,所以扫雷游戏也算是当时是最常火爆的一个电脑游戏。以下文章详细介绍扫雷游戏的实现。实现语言为C++。

啊渊的专栏 1万+

JVM底层操作总结:反射、动态代理、lambda、注解等

反射:https://www.cnblogs.com/yougewe/p/10125073.html 将Java文件保存到本地硬盘后,编译Java文件,生成.class文件,然后使用JVM将字节码文件加载到内存,字节码文件在内存(方法区)中生成一个Class类表示此Java对象 使用反射的时候,首先获取到Class类,这样就可以得到class文件里的所有内容,包含属性、构造方法、普通方法; 属...

631

数据分析:蛋白质组的GO term的富集分析详解

在获取差异表达蛋白质的数据之后,依据蛋白质与基因的对应映射关系,开展GO(Gene Ontology)term的富集分析。通过这一分析流程,能够精准地识别出不同实验组中过表达基因所关联的显著富集的GO term通路。这些富集的GO term通路为后续的生物学研究提供了关键线索,有助于深入探究基因功能、揭示潜在的生物学机制,从而推动生物学发现的进程。

专注生信领域 1368

Java JVM 反射与动态代理

[url=http://www.blogjava.net/AndersLin/archive/2006/06/11/51997.html]JVM,反射与动态代理[/url]

生活需要用心 148

TI硬件笔试面试题型解析上

摘要: 本专栏聚焦大厂硬件笔试面试题解析,当前第14期以德州仪器(TI)为例,涵盖模拟电路与数字电路核心考点。模拟电路部分涉及最大功率传递定理、运放设计(虚短/虚断)、共模抑制比(CMRR)及高频PCB信号完整性;数字电路包括CMOS与TTL对比、建立/保持时间、竞争冒险消除、D触发器分频及“线与”逻辑实现。文章强调通过例题掌握解题方法与知识点,助力读者应对硬件工程岗位的笔试与面试挑战,附常见考点总结与实用建议。全文注重理论与实践结合,提供典型题型解析与设计思路。(150字)

启芯硬件的博客 951

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JVM、反射与动态代理分析

Java 程序的工作机制: Java 对象都以单独的 class 文件存在, java 虚拟机将其载入并执行其虚拟机指令。   Java 虚拟机查找这些 java ...

skybluelight7的博客 118

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaSE 高级【反射-动态代理-设计模式-JVM】篇

目录 一、 Java 中的反射 1-1 .说说你对 Java 中反射的理解 二、 Java 中的动态代理 2-1 写一个 ArrayList 的动态代理类 2-2 动静态代理的区别,什么场景使用? 三、 Java 中的设计模式&回收机制 3-1.你所知道的设计模式有哪些? 3-2 单例设计模式 3-3 工厂设计模式 四、 JDK7 和 JDK8 区别 JDK8: JDK7: 五、 Jvm 虚拟机原理 概述 垃圾回收器(又称为 gc) 1.程序技术器 2.虚..

xinyi_java的博客 1844

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jvm反射和动态代理原理

Java 程序的工作机制: Java 对象都以单独的 class 文件存在, java 虚拟机将其载入并执行其虚拟机指令。   Java 虚拟机查找这些 java 对象: java 虚拟机根据 class path 来查找 java 对象,而虚拟机的 class path 又分为三层: bootstrap : sun.boot.class.path extension: jav...

qxy1987119的博客 241

JVM技术 反射与动态代理

源:http://www.educity.cn/it/sun/200901111502051421.htm 评: 动态代理 Sun对动态代理的说明: 一个简单例子代码: 动态代理的内部实现——代码生成: 研究JDK源代码,发现在Proxy的sun实现中调用了sun.misc.ProxyGenerator类的generateProxyCl...

mauersu 200

JVM技术,反射与动态代理(一)

  Java程序的工作机制:Java对象都以单独的class文件存在,java虚拟机将其载入并执行其虚拟机指令。 看JVM技术,反射与动态代理(二)Java虚拟机查找这些java对象:java虚拟机根据class path来查找java对象,而虚拟机的class path又分为三层:bootstrap:sun.boot.class.pathextension: java

leagle 1112

JVM技术,反射与动态代理(二)

动态代理Sun对动态代理的说明:一个简单例子代码:动态代理的内部实现——代码生成:研究JDK源代码,发现在Proxy的sun实现中调用了sun.misc.ProxyGenerator类的generateProxyClass( proxyName, interfaces)方法,其返回值为byte[]和class文件的内存类型一致。于是做如下试验:

leagle 999
上一篇: Template和JSP技术
下一篇: OnJava : 介绍JBoss Remoting分布式框架
林仪明
博客等级 码龄25年 313粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值