developS

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

反射和代理

一.反射

我们通常都是利利⽤用new ⽅方式来创建对象实例例,这可以说就是⼀一种“正射”,这种⽅方式在编译时候就确定了了类型信息。
⽽而如果,我们想在时候动态地获取类信息、创建类实例例、调⽤用类⽅方法这时候就要⽤用到反射

二.反射原理

Java程序运行分为编译和运行两个步骤,编译后生成字节码文件,JVM操作加载字节码文件,将类型相关的信息加载进入方法区,反射是获取这些信息,进行操作。

三.实际应用

1.连接数据库驱动,使用反射完成(

class.forName(mysql),这样更换数据库时,不需要更改程序代码,程序不需要重新编译就能运行。

因为反射是动态编译的,程序运行期间生成指定类的对象,

这样就可以程序运行期间生成不同的数据库驱动程序对象。省去了固定写死一个数据库驱动对象(通过new 构造函数的方法),造成每更换一个数据库,要重新编译代码的问题

2.spring中的注解,xml配置等是由反射实例化对象

3.springAOP代理设计模式创建对象

三.使用反射实现动态代理

复制代码
public class DynamicProxy implements InvocationHandler {

    private Object mobject;
    public DynamicProxy(Object o){
        this.mobject = o;

    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = method.invoke(mobject,args);
        return result;
    }
}
复制代码
public interface IRoom {


    void seekRoom();//找房
    void watchRoom();//看房
    void room();//给钱租房
    void finish();//完成租房
}
复制代码
public class XiaoMing implements IRoom{

    @Override
    public void seekRoom() {
        System.out.println("找房");

    }

    @Override
    public void watchRoom() {
        System.out.println("看房");

    }

    @Override
    public void room() {
        System.out.println("给钱租房");

    }
复制代码
复制代码
        //构造用户
        XiaoMing xiaoMing = new XiaoMing();
        //构造一个动态代理
        InvocationHandler dynamicProxy = new DynamicProxy(xiaoMing);
        //获取被代理的类的  classLoader
        ClassLoader classLoader =xiaoMing.getClass().getClassLoader();
        //new ProxyInstance 动态构造一个代理
        //传入的类加载器动态生成代理对象实例
        IRoom roomAgency = (IRoom) Proxy.newProxyInstance(classLoader,new Class[]{IRoom.class},dynamicProxy);

        roomAgency.watchRoom();
        roomAgency.seekRoom();
        roomAgency.room();
        roomAgency.finish();
复制代码

 

 

引用:

https://blog.51cto.com/u_15060533/3938238

 

posted on   四十四次日落95  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示