实例讲解Java中 * 和反射机制

作者:laozhang 时间:2022-06-29 04:00:50 

反射机制

Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法、属性和构造方法等。

* :分为JDK * 、cglib * (spring中的 * )。

静态代理

预先(编译期间)确定了代理者与被代理者之间的关系,也就是说,若代理类在程序运行前就已经存在了,这种情况就叫静态代理

*

代理类在程序运行时创建的代理方式。也就是说,代理类并不是在Java代码中定义的,而是在运行期间根据我们在Java代码中的“指示”动态生成的。

* 比静态代理的优势在于:

* 可以很方便的对代理类的函数进行统一的处理(invoke),而不是修改每个代理类的函数,更灵活和扩展。

JDK的 * (依赖于接口)

在Java的 * 机制中,有两个重要的类或接口,一个是InvocationHandler接口,另一个是Proxy类。

InvocationHandler接口是给 * 类实现的,负责处理被代理对象的操作

Proxy类是用来创建 * 类实例对象的,只有得到这个对象,才能调用需要代理的方法。

* 的代理类是在静态代理类上进行修改,将 * 类实现InvocationHandler接口,JAVA电子书重写Invoke方法,Invoke方法通过传入的被代理类方法和参数来执行。

如下实例:


public interface AppService {
void createApp(String name);
void deleteApp(String name);
}
//代理类(比如微商代理)
public class AppServiceImpl implements AppService{

@Override
public void createApp(String name) {
 System.out.print("App["+name+"] has been created.");
}

@Override
public void deleteApp(String name) {
 System.out.print("App["+name+"] has been delete.");
}
}

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

public class LoggerInterceptor implements InvocationHandler {
private Object target; //委托类(被代理类)的实例,比如厂家
public LoggerInterceptor(Object target){
 this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
 System.out.println("Entered "+target.getClass().getName()+"-"+method.getName()+",with arguments{"+args[0]+"}");
 Object result = method.invoke(target, args);
 //调用目标对象的方法 (调用厂家的方法(createApp)及参数(Kevin Test))
 System.out.println("Before return:"+result);
 return result;
}

}

import java.lang.reflect.Proxy;

public class test {

public static void main(String[] args) {
AppService target = new AppServiceImpl();//生成目标对象 (代理类的对象)
//接下来创建代理对象
AppService proxy = (AppService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), new LoggerInterceptor(target));
proxy.createApp("Kevin Test1");
proxy.deleteApp("Kevin Test2");
}

}/**
* 1、jdk的 * 实现方式是依赖于接口的,首先使用接口来定义好操作规范。
* 2、通过proxy类产生的代理对象调用被代理对象的操作。
* 3、而这个操作又被分发给InvocationHandler接口的invoke方法具体执行
*
* 在java的 * 机制中,有两个重要的类或接口,一个是InvocationHandler接口、另一个则是 Proxy类,这个类和接口是实现我们 * 所必须用到的。
InvocationHandler接口是给 * 类实现的,负责处理被代理对象的操作的,而Proxy是用来创建 * 类实例对象的,因为只有得到了这个对象我们才能调用那些需要代理的方法。
*
* 此方法的参数含义如下
proxy:代表 * 对象
method:代表正在执行的方法
args:代表当前执行方法传入的实参
返回值:表示当前执行方法的返回值
*
* 如上:
* 使用了Proxy类的newProxyInstance方法生成代理对象,然后用这个对象去调用createApp()和deleteApp()方法,
* 其实系统会将这2个方法分发给invoke()方法区执行。其中proxy对象的类是系统帮我们动态创建了,其实实现了我们的业务接口AppService
*
*/

cglib * (继承方式)

cglib * 中使用MethodInterceptor来实现 * 类。

* MethodInterceptor中就是由MethodProxy的InvokSuper方法调用代理方法的。

MethodProxy类生成代理方法和代理方法的签名。

JDK * 和Cglib * 的区别:

1、JDK * 是实现了被代理对象的接口,Cglib是继承了被代理对象。

2、Cglib因为是继承机制,所以无法代理被final修饰的方法。

3、JDK和Cglib都是在运行期间生产字节码,JDK是直接写class字节码,Cglib使用ASM框架写class字节码;cglib代理实现更复杂,生成代理类比JDK效率低。

4、JDK调用代理方法,是通过反射实现机制调用,cglib是通过Fashclass机制直接调用方法,效率更高。

Fastcalss机制:

为代理类和被代理类个生成一个class,这个class会为代理类或被代理类的方法分配一个index。

这个index当做一个入参,Fashclass就可以直接定位要调用的方法,并直接进行调用。这样省去了反射调用,所以效率高。

标签:Java, , ,反射机制
0
投稿

猜你喜欢

  • android surfaceView实现播放视频功能

    2022-12-11 12:55:04
  • android中RecyclerView自定义分割线实现

    2023-08-03 17:37:47
  • IDEA设置Tab选项卡快速的操作

    2022-07-15 18:20:31
  • C# 静态构造函数使用总结

    2022-04-28 16:27:35
  • Java开发之Lombok指南

    2022-11-19 21:49:28
  • java实现KFC点餐系统

    2021-09-06 11:36:34
  • Android实现双击返回键退出应用实现方法详解

    2023-03-23 21:33:29
  • Android项目开发之UI设计器

    2022-03-26 14:28:32
  • SpringBoot集成MyBatis的分页插件PageHelper实例代码

    2023-09-11 21:54:33
  • SpringBoot实现动态多线程并发定时任务

    2023-12-12 01:58:26
  • Spring Cloud + Nacos + Seata整合过程(分布式事务解决方案)

    2021-08-31 04:26:52
  • 用Java设计模式中的观察者模式开发微信公众号的例子

    2023-01-17 05:30:58
  • Mybatis中的like模糊查询功能

    2023-09-25 11:57:28
  • 基于Java8 Stream API实现数据抽取收集

    2021-10-01 03:13:03
  • C#读写xml文件方法总结(超详细!)

    2023-11-23 13:16:40
  • 关于c#中单例模式的一些问题

    2022-01-21 08:56:18
  • java实现微信扫码支付功能

    2023-11-09 18:38:08
  • Android可配置透明度的水印

    2021-06-06 14:07:42
  • C#文件断点续传实现方法

    2023-09-07 18:35:05
  • Java面试题及答案集锦(基础题122道,代码题19道)

    2023-11-25 12:36:17
  • asp之家 软件编程 m.aspxhome.com