什么是Proxy对象?什么是class类

本文讨论了JavaScript中的Proxy对象,由target和handler组成,以及它们在构造过程中的作用。同时,文章强调了类的本质是函数,类的声明特性如不可重复声明和类定义不提升。

一个 Proxy 对象由两个部分组成: target 、 handler 。在通过 Proxy 构造函数生成实例对象时,需要提供这两个参数。

                // target 即目标对象, handler 是一个对象,声明了代理 target 的指定行为

                // 严格模式set失效,开启严格模式方法"use strict";

1.class 的本质是 function。

            // 2.不可重复声明。

            // 3.类定义不会被提升,这意味着,必须在访问前对类进行定义,否则就会报错。

            // 4.类中方法不需要 function 关键字。

            // 5.方法间不能加分号。

JDK Proxy是JDK提供的基于接口的代理功能,通过`java.reflect.Proxy`代理实现。由`Proxy.newProxyInstance(ClassLoader interfaceClassLoader, Class<?>[] interfaces, InvocationHandler handler)`创建的对象属于`java.reflect.Proxy`实例。由于Java单继承的特性,JDK Proxy无法对进行代理。生成的默认重载了`java.lang.Object`的`hashCode`、`toString`、`equals`方法,调用`proxy.hashCode`会间接调用`Proxy`的`InvocationHandler`的实现。同时,实现了`InvocationHandler`接口的代理,会继承一个`invoke`方法,可在该方法中添加代码,在方法前后添加动态内容。不过,JDK Proxy依赖于接口,若没有接口则不能实现动态代理[^1][^2]。 以下是一个简单的JDK Proxy示例: ```java package com.test.reflect.jdk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // 定义接口 interface MyInterface { void doSomething(); } // 实现接口的 class MyClass implements MyInterface { @Override public void doSomething() { System.out.println("Doing something..."); } } // 实现InvocationHandler接口 class MyHandler implements InvocationHandler { static final private Logger logger = LoggerFactory.getLogger(MyHandler.class); private Object object = null; public MyHandler(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { logger.info("do something before method {}", method.getName()); Object ret = method.invoke(this.object, args); logger.info("do something after method {}", method.getName()); return ret; } } // 测试 public class JDKProxyTest { public static void main(String[] args) { MyClass myClass = new MyClass(); MyHandler myHandler = new MyHandler(myClass); MyInterface proxyInstance = (MyInterface) Proxy.newProxyInstance( MyInterface.class.getClassLoader(), new Class<?>[]{MyInterface.class}, myHandler ); proxyInstance.doSomething(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值