Java基础(9)-反射与动态代理

分享一个简单的迭代学习机器人双臂控制(MATLAB) 1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大。1984年,Arimoto等人用英文介绍了该方法。它是指不断重复一个同样轨迹的控制尝试,并以此修正控制律,以得到非常好的控制效果的控制方法。 迭代学习控制的特点是“在重复中学习”,通过反复的迭代修正,达到改善控制效果的目的。迭代学习控制的原理是根据系统前次运行所获得的输出误差信息,在控制过程中不断修正控制输入,随着迭代的进行,逐 阅读详情

这两天复习了下反射和代理相关内容,今天总结下~

1.1 RTTI

RTTI指的是Run-Time-Type-Indentification,即运行时类型信息,在Java中有两种实现RTTI的方式:第一种是在编译期就已经确定了类的详情,例如类的名称和其类型和其中的方法,那么可以在编码中直接获取其运行数据;而第二种是在编译期无法知道类的确切的数据和方法等,这时需要使用的是反射技术去动态地解析类的数据

1.2 Class类的使用

首先需要从Class类作为切入点,因为这个类是反射的入口.
Class类位于java.lang包,Class类表示正在运行的Java应用程序中的类和接口,开发者可以通过它获取某些类的信息:

public final class Class
extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement

1.获取Class对象

获取Class对象有三种常用方法:

    1. 使用Class.forName(String path)
//绝对路径
Class<?>  clazz = Class.forName("thinking_in_java.RTTI.dynamic_proxy.DynamicProxyFactory")
//相对路径
Class<?>  clazz = Class.forName("DynamicProxyFactory")
  • 使用getClass()
Class<?>  clazz = new DynamicProxyFactory().getClass();
  • 使用class字面量
Class<DynamicProxyFactory>  clazz = DynamicProxyFactory.class;

以上三种方法都可以获取到类的Class,但是有一些不同在于使用forName()方法和getClass()方法时会将类中的静态域初始化,而使用class字面量则不会将静态域初始化:

  • DemoClass
public class DemoClass {
    static {
        System.out.println("静态块初始化");
    }

    public DemoClass() {
        System.out.println("构造方法初始化");
    }
}

@Test
    public void fun() throws ClassNotFoundException {
        System.out.println("使用forName获取Class对象:");
        Class.forName("thinking_in_java.RTTI.class_and_reflect.DemoClass");
        
        //System.out.println("使用getClass获取Class对象:");
        //Class<? extends DemoClass> aClass = new DemoClass().getClass();
        
       // System.out.println("使用class字面量获取Class对象");
       // Class<DemoClass> demoClassClass = DemoClass.class;
    }

输出结果:

使用forName获取Class对象:
静态块初始化

使用getClass获取Class对象:
静态块初始化
构造方法初始化

使用class字面量获取Class对象

2.通过Class解析类中数据

这部分比较简单,可以看看接口文档,熟悉下常用的方法即可

1.3 反射

Java 反射机制在程序运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种在运行时动态地获取信息 以及动态调用对象的方法 的功能称为Java的反射机制.

首先设置一个DemoClass来作为接下来演示是操作类:

  • DemoClass
/**
 * @Auther: ARong
 * @Date: 19-8-31 上午1:07
 * @Description: 演示反射
 **/
public class DemoClass {

    private String name = "ARong Before Reflect";
    private int age;
    private final static String FINAL_FLAG = "BEFORE";

    static {
        System.out.println("静态块初始化");
    }

    private DemoClass(String name, int age) {
        System.out.println("含参构造方法初始化");
        this.name = name;
        this.age = age;
    }

    public DemoClass() {
        System.out.println("构造方法初始化");
    }

    private String showMeesage(String name, int age) {
        return name+"同学的年龄是"+age;
    }

  public String toString() {
        return "DemoClass{" +
                "name='" + this.name + '\'' +
                ", age=" + this.age +
                '}';
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
    
    public String getFlag() {
        return FINAL_FLAG;
    }
}
1.初始化私有构造器

通过反射机制,我们可以在程序运行时突破类构造器的私有限制,从而去创建一个对象,下面演示使用反射获取私有含参构造函数并且将其创建:

@Test
    public void fun1() throws Exception {
        // TODO: 19-8-31 通过反射执行私有方法[空构造方法为private]
        Class<DemoClass> clazz = DemoClass.class;
        //获取类的特点含参构造
        Constructor<DemoClass> constructor = clazz.getDeclaredConstructor(String.class, int.class);
        //破除权限
        constructor.setAccessible(true);
        //通过构造函数创建对象实例
        DemoClass demoClass = constructor.newInstance("阿荣通过反射获取到私有构造函数初始化对象", 20);
        System.out.println(demoClass.toString());
    }

输出

静态块初始化
含参构造方法初始化
DemoClass{name=‘阿荣通过反射获取到私有构造函数初始化对象’, age=20}

2.修改私有成员变量

通过反射机制,我们可以在程序运行时获取并且修改程序的私有成员变量:

@Test
    public void fun2() throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        // TODO: 19-8-31 私用反射修改私有成员变量
        DemoClass demoClass = new DemoClass();
        Class<? extends DemoClass> clazz = demoClass.getClass();
        System.out.println("未修改前的name:"+demoClass.getName());
        //获取私有变量name
        Field name = clazz.getDeclaredField("name");
        //破除权限
        name.setAccessible(true);
        //修改
        name.set(demoClass, "阿荣通过反射修改私有变量");
        System.out.println("修改后的name:"+demoClass.getName());
    }

输出

静态块初始化
构造方法初始化
未修改前的name:ARong Before Reflect
修改后的name:阿荣通过反射修改私有变量

既然反射机制那么地万能,所以我们是否也可以修改final修饰的成员变量呢?试试就知道:

@Test
    public void fun3() throws Exception {
        // TODO: 19-8-31 通过反射修改私有的final变量
        //使用反射获取类信息
        DemoClass demoClass = new DemoClass();
        Class<? extends DemoClass> clazz = demoClass.getClass();
        //获取私有变量
        Field field = clazz.getDeclaredField("FINAL_FLAG");
        //设置访问权限
        field.setAccessible(true);
        System.out.println("使用反射修改前:"+demoClass.getFlag());
        //修改私有变量
        field.set(demoClass, "AFTER");
        System.out.println("使用反射修改后:"+demoClass.getFlag());
    }

输出

静态块初始化
构造方法初始化
使用反射修改前:BEFORE
使用反射修改后:BEFORE

事实证明,我们无法通过反射去修改对象中的final对象,因为在JVM编译类成字节码时,就已经将其优化成

public String getFlag() {
        return "BEFORE";
}
3.执行私有方法

同样地,我们可以通过反射去执行类中的私有方法:

@Test
    public void fun4() throws Exception {
        // TODO: 19-8-31 通过反射执行私有方法[空构造方法为private]
        DemoClass demoClass = new DemoClass();
        Class<? extends DemoClass> clazz = demoClass.getClass();
        //获取私有方法并且设置参数
        Method showMessage = clazz.getDeclaredMethod("showMeesage", String.class, int.class);
        //突破权限
        showMessage.setAccessible(true);
        //执行方法
        String message = (String) showMessage.invoke(demoClass, "阿荣通过反射执行私有含参方法", 20);
        System.out.println(message);
    }

输出

静态块初始化
构造方法初始化
阿荣通过反射执行私有含参方法同学的年龄是20

1.4 代理模式

代理模式是Java中一种应用很广泛的设计模式,它的思想是通过代理对象访问到目标对象,并且对目标对象进行增强,这里的目标对象即为被代理的对象

代理模式可分为两种 ,即静态代理和动态代理;对于静态代理而言,代理对象必须在编译期知道目标对象的具体类型和方法;当在编译期无法判断目标对象的具体类型时,则需要使用动态代理技术,而动态代理一般有JDK动态代理与CGLIB动态代理两种,下面来一一介绍

1. 静态代理

静态代理需要代理对象和目标对象同时实现一个提供方法的接口,并且在代理对象中运用组合的手法:
在这里插入图片描述

  • ShopService接口
	public interface ShopService {
    /**
    * @auther: Arong
    * @description: 查找商品类别信息
    * @param: type
    * @return: Object
    * @date: 下午12:27 19-8-30
    */
    Object showProducts(String type);
}
  • ShopService实现类
	/**
 * @Auther: ARong
 * @Date: 19-8-30 下午12:27
 * @Description: ShopService的实现类(目标对象)
 **/
public class ShopServiceImp implements ShopService{
    @Override
    public Object showProducts(String type) {
        //根据type查询数据库
        System.out.println("ShopServiceImp查询数据库,获取"+type+"的数据");
        return type;
    }
}
  • 代理对象
/**
 * @Auther: ARong
 * @Date: 19-8-30 下午12:32
 * @Description:  ShopService的代理实现类
 **/
public class ShopServiceProxy implements ShopService{
    private ShopService target;

    /**
     * @auther: Arong
     * @description: 代理构造方法
     * @param: [target]
     * @return:
     * @date: 下午12:34 19-8-30
     */
    public ShopServiceProxy(ShopService target) {
        this.target = target;
    }


    @Override
    public Object showProducts(String type) {
        //增强方法
        System.out.println("静态代理对参数进行了正确性判断......");
        Object res = target.showProducts(type);
        System.out.println("静态代理对结果进行了处理......");
        return res;
    }
}

以上三个类组成了一个完整的静态代理模式链,有方法接口,目标对象和代理对象,我们在程序中如何使用代理对象来执行目标对象的方法或者增强呢?其实很简单,如下:

public class Test {
    @org.junit.Test
    public void fun() {
        //使用动态代理执行ShopService的showProducts方法
        ShopServiceProxy proxy = new ShopServiceProxy(new ShopServiceImp());
        proxy.showProducts("APPLE");
    }
}

输出

静态代理对参数进行了正确性判断…
ShopServiceImp查询数据库,获取APPLE的数据
静态代理对结果进行了处理…

我们从输出可以看到,通过代理对象执行了目标对象的方法并且对其进行了增强;但是这种静态代理的方式对于需要代理的目标来说如果很多的话,需要为其一一创建一个特定的代理类,这样十分地不方便,所以这就需要在运行时动态地获取到目标对象并且对其增强,此时产生了动态代理技术;

2.JDK动态代理

JDK动态代理技术使用的是java.lang.reflect包,即反射包中的工具类,通过与反射技术是结合,可以让我们在运行时动态地去执行目标对象的方法,我们使用到的目标对象还是之前的ShopServiceImp:

  • java.lang.reflect Proxy,主要方法为
//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
static Object newProxyInstance(ClassLoader loader,  //指定当前目标对象使用类加载器
 Class<?>[] interfaces,    //目标对象实现的接口的类型
 InvocationHandler h      //事件处理器
) 
  • java.lang.reflect InvocationHandler,主要方法为
 Object invoke(Object proxy, Method method, Object[] args) 
// 在代理实例上处理方法调用并返回结果。
  • JDK动态代理对象
/**
 * @Auther: ARong
 * @Date: 19-8-30 下午5:30
 * @Description: 动态代理工厂
 **/
public class DynamicProxyFactory{
    //被执行的目标对象,不限定类型
    private Object target;

    public DynamicProxyFactory(Object target) {
        this.target = target;
    }
    /**
     * @auther: Arong
     * @description: 获取目标对象的代理对象
     * @param: []
     * @return: java.lang.Object
     * @date: 下午4:18 19-8-31
     */
    public Object getProxyInstance() {
        //创建处理器,对目标对象的方法进行增强
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //增强方法
                System.out.println("动态代理对参数进行了正确性判断......");
                //执行目标对象的方法
                Object res = method.invoke(target, args);
                System.out.println("动态代理对结果进行了处理......");
                return res;
            }
        };
        //获取代理对象
        Object res = Proxy.newProxyInstance(
                target.getClass().getClassLoader(),//获取目标对象的类加载器
                target.getClass().getInterfaces(),//获取目标对象实现的接口
                handler                           //处理器
        );
        return res;
    }
}

对JDK动态代理进行测试:

public class Test {
    @org.junit.Test
    public void fun() {
    	//获得目标对象的动态代理工程
        DynamicProxyFactory factory = new DynamicProxyFactory(new ShopServiceImp());
        //获得目标对象的动态代理对象
        ShopService proxy = (ShopService)factory.getProxyInstance();
        //打印当前代理对象类位置
        System.out.println(proxy.getClass());
        //使用代理对象执行增强方法
        String res = (String) proxy.showProducts("APPLE");
        System.out.println(res);
    }
}

输出

class com.sun.proxy.$Proxy4
动态代理对参数进行了正确性判断…
ShopServiceImp查询数据库,获取APPLE的数据
动态代理对结果进行了处理…
APPLE

我们可以从代码中发现,现在我们的类图是这样子的:
在这里插入图片描述

此时动态代理对象(工厂)已经不再需要实现ShopService接口,所以它无需在编译期去通过组合辨别目标对象的类型,而是在运行时通过反射机制去获取目标对象的字Class与实现的接口和方法参数,这样就更有利于动态代理对象与接口解耦

3.CGLIB动态代理

cglib (Code Generation Library )是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。

  • CGLIB与JDK动态代理的不同之处
    1.JDK动态代理需要目标对象实现接口取得方法,而CGLIB动态代理则不需要目标对象去实现接口

  • 2.CGLIB是一个强大的高性能的代码生成包,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和dynaop,为他们提供方法的interception(拦截)(当目标对象有实现方法接口时,Spring使用JDK动态代理;当没有实现接口时,使用CGLIB代理)

  • 3.CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类

CGLIB与JDK动态代理最大的区别就是:

使用动态代理的对象必须实现一个或多个接口
使用cglib代理的对象则无需实现接口,达到代理类无侵入。并且使用CGLIB生成的动态代理对象是目标对象的增强子类

  • 引入Jar包
    使用CGLIB需要引入CGLIB的jar包,如果你已经有spring-core的jar包,则无需引入,因为spring中包含了CGLIB。

cglib的Maven坐标

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.2.5</version>
</dependency>
  • ShopService无需实现接口
/**
 * @Auther: ARong
 * @Date: 19-8-30 下午12:27
 * @Description:
 **/
public class ShopService {
    public Object showProducts(String type) {
        //根据type查询数据库
        System.out.println("ShopService查询数据库,获取"+type+"的数据");
        return type;
    }
}
  • CGLIB动态代理
/**
 * @Auther: ARong
 * @Date: 19-8-30 下午10:46
 * @Description: cglib动态代理生成目标代理子类
 **/
public class DynamicProxyFactory implements MethodInterceptor {
    //需要被代理的对象
    private Object target;

    public DynamicProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxyInstance() {
        //获取增强器
        Enhancer enhancer = new Enhancer();
        //设置增强器的父类
        enhancer.setSuperclass(target.getClass());
        //设置回调函数
        enhancer.setCallback(this);
        //创建增强代理子类
        return enhancer.create();
    }


    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //增强方法
        System.out.println("动态代理对参数进行了正确性判断......");
        //执行目标对象的方法
        Object res = method.invoke(target, args);
        System.out.println("动态代理对结果进行了处理......");
        return res;
    }
}
  • 测试CGLIB动态代理
public class Test {
    @org.junit.Test
    public void fun() {
        //获取CGLIB动态代理工厂
        DynamicProxyFactory proxyFactory = new DynamicProxyFactory(new ShopService());
        //获取动态代理子类对象
        ShopService proxy = (ShopService)proxyFactory.getProxyInstance();
        //打印代理对象信息
        System.out.println(proxy.getClass());
        String res = (String) proxy.showProducts("APPLE");
        System.out.println(res);
    }
}

输出

class thinking_in_java.RTTI.cglib_proxy.ShopService E n h a n c e r B y C G L I B EnhancerByCGLIB EnhancerByCGLIB$bf82dc7d
动态代理对参数进行了正确性判断…
ShopService查询数据库,获取APPLE的数据
动态代理对结果进行了处理…
APPLE

4.JDK动态代理与CGLIB动态代理输出结果的比较

从上述的输出结果中,通过调用代理类.getClass获取到其真正的类型,我们可以发现:
1. JDK动态代理生成的是class com.sun.proxy.$Proxy4这个代理对象去执行增强方法
2. CGLIB动态代理生成的是thinking_in_java.RTTI.cglib_proxy.ShopService$EnhancerByCGLIB$$bf82dc7d,即ShopService的子类去执行增强方法。

Thanks

  • https://segmentfault.com/a/1190000011291179
  • https://juejin.im/post/5ad3e6b36fb9a028ba1fee6a
  • http://www.matools.com/api/java8
  • https://blog.youkuaiyun.com/yhl_jxy/article/details/80635012
  • https://juejin.im/post/598ea9116fb9a03c335a99a4#heading-0
  • https://blog.youkuaiyun.com/qq_21808961/article/details/80376732
BGE-Reranker-v2-M3介绍 重排序模型介绍 阅读详情

相关推荐

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

【spring系列】spring的AOP是在哪个阶段创建的动态代理对象,spring bean的生命周期中在什么阶段创建的aop动态代理对象,很多人会说第一种,其实还有一种情况也会进行aop

2. 【属性注入时候】还有一种特殊情况,是在Bean的属性注入的时候,存在循环依赖的情况下,也会为循环依赖的Bean通过 MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()方法创建aop。spring的AOP是在哪个阶段创建的动态代理对象,spring bean的生命周期中在什么阶段创建的aop动态代理对象,很多人会说第一种,其实还有一种情况也会进行aop。:然后,为Bean填充依赖注入的属性。

xzb5566的专栏 2361

江科大51单片机笔记【1】单片机及开发板介绍

单片机,Micro Controller Unit,简称MCU,内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(传感器)、处理(CPU)和硬件设备(电机、LED)的控制单片机算是一个袖珍版计算机,是一个完整的计算机系统,成本低体积小结构简单单片机的使用领域:智能仪表、实时工控、通讯设备、导航系统、家用电器等。

2301_80195807的博客 848

Spring 4 学习笔记4:Java动态代理(Spring AOP原理)

介绍Spring AOP原理,Java动态代理

acherie的博客 954

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1914

JQ8900语音播报模块在RT-Thread系统下的驱动移植与测试详解

本文详细讲解了如何在RT-Thread嵌入式操作系统中,为JQ8900语音播报模块进行驱动移植与功能测试。内容涵盖从获取驱动代码、配置Kconfig工程、编译烧录到核心代码解析的完整流程,并提供了基于串口通信的上电测试与问题排查方法,帮助开发者快速掌握在RT-Thread系统下集成外部模块的核心技能。

weixin_35677363的博客 593

类加载器、反射

类加载器、反射 1.类加载器 1.1类加载【理解】 ◆类加载的描述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的加载,类的连接,类的初始化这三个步骤来对类进行初始化。如果不出现意外情况,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或者类初始化 ◆类的加载 就是指将class文件读入内存,并为之创建一个 java.lang.Class 对象 任何类被使用时,...

fyyxc的博客 194

微信小程序、H5微信公众号网页JSAPI:解决报错requestMerchantTransfer:fail:internal error(使用wx.requestMerchantTransfer错误)

如何解决requestMerchantTransfer:fail:internal error,微信小程序wx.requestMerchantTransfer报错,微信公众号H5网页使用jssdk调用wx.requestMerchantTransfer报错,JSAPI调起用户确认收款报错errMsg:“requestMerchantTransfer:fail:internal error“,微信小程序/H5 调起确认收款界面,JSAPI调起用户确认收款,微信公众号(H5),用户发起提现,商家转账给用户,用户

✅ 精选推荐文章 4976

accessdeniedexception: 不允许访问_一招解决JDK9以上非法反射访问警告

如果觉得文章好看,欢迎点赞。同时欢迎关注微信公众号:氷泠之路。1 问题描述JDK9以上很多库都有这种非法反射访问的警告,比如protostuff:解决方法两个:JDK降级添加JVM参数2 原因降到JDK8能解决以上问题。但是这不是本文的重点。先说一下出现该警告的原因,笔者使用的JDK为OpenJDK 11,JDK9以上模块不能使用反射去访问非公有的成员/成员方法以及构造方法,除非模块标识...

weixin_39633452的博客 2862

1.2 amdgpu_bo的设计分析 — gem层和ttm层

本文分析了AMD KFD的BO设计架构,重点介绍了DRM子系统中缓冲对象的多层继承关系。文章首先展示了核心继承层次图,包括DRM通用层(drm_gem_object)、TTM内存管理层(ttm_buffer_object)、AMD驱动层(amdgpu_bo)和KFD计算层(kgd_mem)。随后详细解析了drm_gem_object结构体的关键功能,包括用户空间接口管理、内存映射支持、引用计数机制以及DMA-BUF导入/导出功能。

图形/计算GPU的驱动与虚拟化技术分享园地 2551

VMware下载与安装

一、VMware下载 二、VMware安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 317

反射机制的应用,jdk8和jdk9接口的新特性接口属性,Lambda表达式

目录一、反射1.1 反射的概念1.2 获取Class对象和构造方法1.3 获取方法1.4 案例应用二、jdk8和jdk9接口的新特性2.1 jdk8:默认方法和静态方法2.2 jdk9:私有的方法三、Lambda表达式3.1 Lambda表达式简化方式3.1.1 一参有返回值3.1.2 一参以上有返回值3.1.3 无参无返回值3.1.4 有参数没有返回值3.1.5 无参数有返回值 一、反射 1.1 反射的概念 通过反射机制可以获取所有的资源 反射机制:获取类的各个部分,组成一个新的对象(Class对象)就

java开发、后端开发者 846

使用 Simulink Real-Time 搭建一个完整的实时信号采集与滤波系统模型

本文详细介绍了基于Simulink Real-Time构建实时信号采集与滤波系统的完整流程。主要内容包括:系统配置(模型创建与参数设置)、信号采集模块搭建(模拟信号源或真实硬件连接)、实时滤波器设计(浮点/定点)、输出可视化(Scope/ToWorkspace等)、模型编译与下载到目标机、外部模式在线调试及数据保存方法。系统可实现微秒级实时信号处理,适用于工业控制、航空航天等对时间确定性要求高的场景。文章还提供了优化建议(多速率建模、优先级调度等)和应用场景说明,帮助读者快速掌握实时系统开发的核心技能。

amy_mhd的博客 304

Java面试复习9 Java中的反射和动态代理

Java面试复习9 Java中的反射和动态代理 声明:本面试复习都基于一本未署名的Java面试宝典所述,根据自己的理解写出了这一专栏的复习博客 说说你对Java反射的理解 按照我的个人理解,Java中的反射其实就是能够让程序在执行期间获取某一个特定类中的各种信息,包括类名,属性,方法,类的构造器属性,并且能够操控这些方法和属性。 这种对于反射的利用,使得程序在执行期间就可以动态的获取类中的各种...

yikuki的博客 283

Devexpress16.2.6破解工具

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java 27 - 9 反射之 动态代理的概述和实现

 代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。  举例:春季回家买票让人代买 动态代理:   在程序运行过程中产生的这个对象   而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理 在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通...

dielunyuan5091的博客 124

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Day78 Java基础知识点(9) 反射和动态代理

反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 Java反射: 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类。 在运行时构造任意一个类的对象。 在运行时判断任意一个类所具有的成员变量和方法。 ...

qq_31707969的博客 169

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

通过反射获取当前类的接口并调用

通过反射获取当前类的接口并调用 java 9 以后对于clazz.newInstance() 过时 替换成clazz.getDeclaredConstructor().newInstance() 知识点 Java Class.forName()返回一个类 Class.forName()要求JVM查找并加载指定的类,作用是执行该类的静态代码段,加载了类以后还需要进行类初始化操作之后才能正常使用此类,类初始化操作就是执行一遍类的静态语句,包括静态变量的声明还有静态代码块。 ** Class.forName

d773689630的专栏 2661

【面试专栏】第二篇:Java基础:泛型、IO、动态代理、反射、XML、jdk8、jdk9

【面试八股文】第二篇:Java基础:泛型、IO、动态代理、反射、XML、jdk8、jdk9

木秀林的博客 1471

动态代理

1.动态代理简介。 动态代理是一种方便运行时构建代理,动态处理代理方法调用的机制。比如包装RPC调用,面向切面编程(AOP)就是通过动态代理实现的。 2.动态代理的方式。 动态代理的方式有多种,常用的是JDK自身提供的动态代理(主要利用了反射机制)。cglib方式。 JDK提供的代理以接口为中心,cglib动态代理采取的是创建目标子类的方式。 3.反射机制。 反射机制赋予了程序运行时自...

qq_28702285的博客 179

JAVA基础—关于Java的反射机制

换句话说,类加载器在加载类文件时会提供一些关于类的信息,这些信息包括类的结构、方法、字段等,而这些信息可以通过class对象的方法获取。当一个类A中包含了另一个类B,而类B又包含了类C,这种情况就构成了嵌套结构。在这个例子中,类A就是嵌套结构的主要部分,而类B和类C是嵌套在类A中的成员。Class类主要作用是允许程序在运行时获取类信息,并通过反射机制实例化对象、访问和修改类的字段、调用类的方法等。:Class对象的一些方法可以用来描述类或接口在嵌套中的情况,嵌套是一组允许互相访问私有成员的类和接口的集合。

tanmoney的博客 988

spring-core-1-08 | JDK API实践:Spring怎样取舍Java I/O、集合、反射、动态代理等API的使用?

JDK 核心API 以上的核心API也是工作中对于java常用的, 有必要了解. < Java 5 主要罗列的是 Java 1.2 之后的 API, 反射是从 Java 1.2 以后开始引入的, 其实就是 Java Beans, 在spring中的引用非常广泛. 动态代理也是 spring 1.0 开始 就必须依赖的东西, 就是 Proxy 或者 InvocationHandler 的 API. Java 5 运用到大量的新型API. 并发框架(J.U.C), 格式化(Formatter), JMX

sunforraining的博客 256

AOP-动态代理-反射

AOP 如何实现?动态代理是基于什么原理实现的?

ChenxiLiylnf的博客 1953

Java反射机制:深入底层的“破窗锤”与实践指南

反射是Java中突破封装、实现动态性的核心技术,它就像一把“双刃剑”——用得好能成为框架开发的利器,用得差则会破坏代码的安全性和可维护性。核心认知:反射的本质是操作Class对象,而Class对象是JVM加载类时创建的元数据载体。核心API围绕构造器、属性、方法展开,用于获取所有权限的成员,用于突破私有限制。反射的核心应用是动态代理和框架开发,日常业务代码应尽量避免使用。性能和安全是反射的主要痛点,可通过缓存、MethodHandle等方式优化。

2302_80192044的博客 1665

Java反序列化学习(一)

不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。3、入口参数中包含可控类,该类有调用其他危险方法的类,readObject时调用。​ 当A.readObject->O.f-(由于传入的是URL)>B.f。2、入口类参数中包含可控类,该可控类有危险方法,readObject时调用。​ 通过Class类创建对象,引用不能序列化的类。

qq_53063436的博客 475

Java反射-动态代理

Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。

qq_35740095的博客 241

企业级Java项目中处理JavacProcessingEnvironment字段问题的实战案例

通过这个案例,我们学到了几个重要的经验:在Java模块化环境下,不能过度依赖反射访问内部API,应该优先寻找官方支持的解决方案。设计系统时要考虑向前兼容性,特别是当项目需要支持多个Java版本时。将平台相关的特殊处理集中管理,可以显著降低维护成本。如果你也在开发Java编译器插件或需要访问JDK内部API的工具,希望这个案例能给你一些启发。在实际开发中,InsCode(快马)平台的实时预览功能特别适合用来快速验证这类问题的解决方案,无需反复打包部署就能看到修改效果,大大提高了调试效率。

MoonbeamRaven28的博客 727
上一篇: Java基础(8)-异常体系以及项目中的运用
下一篇: 算法学习笔记(10)-缓存淘汰算法LRU
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值