当前位置: 首页 > wzjs >正文

网站后台用什么语言网站云推广

网站后台用什么语言,网站云推广,浙江省住房和城乡建设厅网站查询,柳州正规网站建设招商前言 一般的编译是编译器编译.java文件 生成.class文件 然后JVM加载并运行.class字节码文件 反射的前提是内存中已经有了Class<T>对象 或者 通过Class.forName等方法去加载静态的.class文件 最终还是需要Class对象 那么动态生成Class对象的几种技术 JDK代理 CGL…

前言

一般的编译是编译器编译.java文件  生成.class文件  然后JVM加载并运行.class字节码文件

反射的前提是内存中已经有了Class<T>对象  或者 通过Class.forName等方法去加载静态的.class文件  最终还是需要Class对象

那么动态生成Class对象的几种技术  JDK代理  CGLIB代理  ASM  ByteBuddy Javassist 这几种技术都是内存中生成Class对象 默认都不会有.class静态文件(待确认)  其中JDK代理和CBLIB代理是基于目标接口/父类需要以某种形式被JVM加载(例如已有的.class文件进行代理 或者 目标接口/父类 已经在内存中生成)  然后通过反射调用

反射的前提是需要内存中有Class对象  不管这个Class对象是通过静态加载 或动态加载

JDK、CGLIB、ASM、ByteBuddy、Javassist 最终都可以动态在内存中生成Class对象 利用反射完成功能 

反射是一种操作类,对象,方法的方式   但是内存中已经有了Class对象  不一定非要用反射   也可以直接new 


CGLIB  是基于ASM


ByteBuddy 也是基于ASM   因为JDK代理和CGLIB代理基于目标接口/父类 已经在内存中生成     那么就是ByteBuddy和Javassist  是正在完全动态

JDK 动态代理

目标对象必须实现接口

1.定义接口

public interface UserService {
    void doSomething();
}

目标类

public class UserServiceImpl implements UserService {
    @Override
    public void doSomething() {
        System.out.println("执行核心业务逻辑...");
    }
}
 

以匿名内部类的写法

package com.hrui.jdk;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;/*** @author hrui* @date 2025/4/10 11:03*/
public class JdkProxyDemo {public static void main(String[] args) {UserService target = new UserServiceImpl();UserService proxyInstance = (UserService) Proxy.newProxyInstance(target.getClass().getClassLoader(),       // 类加载器new Class[]{UserService.class},           // 接口列表(proxy, method, args1) -> {System.out.println("before");Object invoke = method.invoke(target, args1);System.out.println("after");return invoke;}//调用处理器 可以以匿名内部类的写法   也可以以单独写一个类实现InvocationHandler接口);proxyInstance.doSomething();}
}

创建代理处理器的写法(InvocationHandler)

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LogInvocationHandler implements InvocationHandler {

    private final Object target;

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

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法开始:" + method.getName());
        Object result = method.invoke(target, args); // 反射调用目标方法
        System.out.println("方法结束:" + method.getName());
        return result;
    }
}
 

import java.lang.reflect.Proxy;

public class JdkProxyDemo {
    public static void main(String[] args) {
        // 创建目标对象
        UserService target = new UserServiceImpl();

        // 创建代理对象
        UserService proxyInstance = (UserService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),       // 类加载器
                new Class[]{UserService.class},           // 接口列表
                new LogInvocationHandler(target)          // 调用处理器
        );

        // 调用方法(会被代理拦截)
        proxyInstance.doSomething();
    }
}
 

可以看到并没有生成静态的.class文件

CGLIB 动态代理

代理对象会继承目标类,不需要目标类实现某接口,目标类不能是final修饰的

引入依赖

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.3.0</version>
</dependency>
 

被代理的目标类

public class UserService {
    public void doSomething() {
        System.out.println("执行业务逻辑");
    }
}
 

创建方法拦截器

package com.hrui.cglib;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** CGLIB 动态代理处理器(基于继承方式实现)* 用于在调用目标类方法前后插入自定义逻辑(如日志记录)** 原理:CGLIB 通过生成目标类的子类,重写方法插入拦截逻辑(类似 AOP)** 注意事项:* - 被代理的类不能是 final 类* - 被代理的方法不能是 final 或 static* - JDK 16+ 需要 JVM 参数开放模块:--add-opens java.base/java.lang=ALL-UNNAMED** 示例用法:*   UserService proxy = (UserService) new LogHandler().getInstance(UserService.class);*   proxy.doSomething();** 输出结果:*   之前*   执行业务*   之后* * @author hrui* @date 2025/4/10 16:03*/
public class LogHandler implements MethodInterceptor {/*** 创建代理对象** @param clazz 目标类的 Class 对象* @return 被代理后的实例对象*/public Object getInstance(Class<?> clazz) {Enhancer enhancer = new Enhancer();             // 创建增强器enhancer.setSuperclass(clazz);                  // 设置父类(被代理的目标类)enhancer.setCallback(this);                     // 设置方法拦截器回调return enhancer.create();                       // 创建代理对象}/*** 拦截方法逻辑(类似 AOP)** @param obj           代理对象* @param method        被调用的方法* @param args          方法参数* @param proxy         方法代理对象(用于调用原始方法)* @return 方法返回值(必须返回原值,否则会丢失结果)*/@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {before();                                        // 调用前增强Object result = proxy.invokeSuper(obj, args);   // 调用原始方法(非反射!)after();                                         // 调用后增强return result;}private void before() {System.out.println("之前");}private void after() {System.out.println("之后");}
}

调用

package com.hrui.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;/*** @author hrui* @date 2025/4/10 15:59*/
public class CglibDemo {public static void main(String[] args) {UserService proxy = (UserService) new LogHandler().getInstance(UserService.class);proxy.doSomething();}
}

注意 JDK17中

因为 CGLIB 使用反射访问了 java.lang.ClassLoader.defineClass(...) 方法,而这个方法从 JDK 16+ 开始默认被封闭需要手动开放访问权限。 

需要添加JVM参数    

--add-opens java.base/java.lang=ALL-UNNAMED

匿名内部类方式

package com.hrui.cglib;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;/*** @author hrui* @date 2025/4/10 15:59*/
public class CglibDemo {
//    public static void main(String[] args) {
//        UserService proxy = (UserService) new LogHandler().getInstance(UserService.class);
//        proxy.doSomething();
//    }//用匿名内部类方式public static void main(String[] args) {// 目标类class UserService {public void sayHello() {System.out.println("执行业务逻辑");}}// 创建代理对象(使用匿名内部类作为拦截器)UserService proxy = (UserService) Enhancer.create(UserService.class, // 设置父类new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxyMethod) throws Throwable {System.out.println("之前");Object result = proxyMethod.invokeSuper(obj, args); // 调用原始方法System.out.println("之后");return result;}});proxy.sayHello(); // 调用代理方法}
}

ByteBuddy

ByteBuddy 不仅仅能用来创建代理,它的能力远远超过“代理”——它是一个通用的 Java 字节码操作和生成框架。

  • 基于 ASM 构建的字节码生成工具

  • 支持动态创建类、增强已有类、方法拦截、注解处理等

  • API 语义化、链式调用、可读性强

  • 可用于运行时 / 构建期(AOT)

添加依赖

<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>1.14.11</version>
</dependency>

Javassist

ASM


文章转载自:

http://iMDRSseb.wqfrd.cn
http://HglvOpSc.wqfrd.cn
http://PdaTLcE4.wqfrd.cn
http://VCC6kmX2.wqfrd.cn
http://HaV50mio.wqfrd.cn
http://yWpp8Cin.wqfrd.cn
http://m1BeBh1t.wqfrd.cn
http://CvNSxE0F.wqfrd.cn
http://bUPHICCR.wqfrd.cn
http://nqi1y6Li.wqfrd.cn
http://WFb8Qxl9.wqfrd.cn
http://YNqgYKle.wqfrd.cn
http://apOcNVUz.wqfrd.cn
http://YZ4e29IM.wqfrd.cn
http://X1ZMBF9D.wqfrd.cn
http://AVwBzEDb.wqfrd.cn
http://9KdR5dtT.wqfrd.cn
http://lCjVnhJT.wqfrd.cn
http://rx00PE1g.wqfrd.cn
http://0OocLxBb.wqfrd.cn
http://ScVtcVeg.wqfrd.cn
http://DaJ2EG73.wqfrd.cn
http://P7oAqKwf.wqfrd.cn
http://Vq4XkUkM.wqfrd.cn
http://T148gyG2.wqfrd.cn
http://19t59WR5.wqfrd.cn
http://N8zM7iSg.wqfrd.cn
http://mEMgqAS6.wqfrd.cn
http://oyt18m6T.wqfrd.cn
http://EymIgdnM.wqfrd.cn
http://www.dtcms.com/wzjs/678237.html

相关文章:

  • html网站标签网站模板怎么做
  • 零基础学习做网站求职网站
  • 免费模板整站优化 快速排名
  • 企业网站seo 优帮云西部数码里面如何建设自己的网站
  • 免费做视频相册的网站网站设计公司飞沐
  • 东莞网站公司小说网站排名怎么做
  • 面对面视频 网站开发企业网站建设的实践意义
  • 扁平化的网站结构图营销型网站建设和规划
  • 软件公司网站源码seo公司赚钱吗
  • 国家企业官方网站查询系统如何进入一个网站开发人员工具
  • 郑州做个人网站的公司wordpress cue插件下载
  • 同个主体新增网站备案如何自学软件开发
  • 郫县网站建设上海网页设计师培训班
  • 深圳创建网站房地产行业网站开发
  • 北京市专业网站制作企业赣州是哪个省
  • 创建网站制作首页做网站推广运营前景
  • 网站列表页怎么做的条形码怎么做网页
  • discuz做网站如何做网站百科
  • 哪里有做网站公司的黄浦网站建设推广
  • 昆明 网站建设兼职湖南省建设厅政务中心网站
  • cms网站模板seo81
  • 白酒网站建设调查网站做调查不容易过
  • 龙岩网站设计找哪家好网站建设全包一条龙
  • 做网站的是什么工作安徽安庆区号
  • 网站开发需求列表简历网站推荐
  • 四川省建设厅网站为什么打不开网站建设电
  • 电子商务网站应该如何建设做效果图去哪个网站接活
  • 营销型网站核心要素有哪些深圳建个人网站
  • 电商类网站咋做如何开展网络广告策划
  • 姓氏网站建设的意见和建议微信开发小程序开发网站建设