学习Java基础知识,打通面试关七

首先声明下,因为自己原先对于版权的了解的甚少。原先写的文章摘录极客时间的内容比较多,以后写文章虽然还会按照极客时间的目录走。如果我写的太浅显,大家还是去极客时间上看原版。谢谢。

今天我们开始看下反射与代理还有部分集合的知识。希望大家能满意。

反射

我们都知道反射在Java语言中是一种基础功能,在运行状态中,能够通过反射的方式来知道一个类的所有属性,方法,构造对象甚至是修改类的信息等。总结 。反射就是把Java类映射成一个个的Java对象

Class  stu  = Class.forName("com.love.manage.bean.StudentBean");

            Constructor[] constructors = stu.getConstructors();  // 获得构造器的方法

            Object object = stu.newInstance();   //获得一个对象
            Method[] methods = stu.getMethods();   //获得其 方法
            Field dec = stu.getDeclaredField("name");  //获得私有字段
            dec.setAccessible(true);  //暴力反射 解除私有限定  修改其内容  
            // 并且这个应用尝尽十分普遍,自爱我们的日常的开发、测试 依赖注入等都有用到了。特别是框架中使用反射来做到持久化数据
            //在最新的Java9 中 肯能会将其限制丢弃 改用别的模式

除了我们在平常中通过反射 获得其方法属性构造方法之外,我们还有通过反射越过泛型的检查

ArrayList<String> list= new ArrayList<>();  
        list.add("content1");  
        list.add("content2");  

        //获取ArrayList的Class对象,反向的调用add()方法,添加数据  
        Class listClass= list.getClass(); //得到 list对象的字节码 对象  
        //获取add()方法  
        Method m = listClass.getMethod("add", Object.class);  
        //调用add()方法  
        m.invoke(list, 100);  
          
        //遍历集合    这样我们就把泛型的检查去除了
        for(Object obj : strList){  
            System.out.println(obj);  
        }

动态代理

在java中代理是一种十分普遍的现象,我们经常会用到,比如我们经常用到的Spring 中的AOP 就用到了代理。其中java中的代理主要是通过jdk的代理实现的。当然我们还有其他动态代理比如cglib ,ASM等。

为什么会使用动态代理?

我们都知道在程序中,有一点比较重要的就是解耦。减少程序与程序间的影响。我们就可以通过代理来实现。使用代理者可以不用了解底层是怎么实现的,只关注自己在使用的时候怎么使用即可,方便了自己去扩展。

jdk代理

java中的jdk动态代理是通过其内部的反射机制来实现的,这样在生成类的时候更加高效。但是jdk动态代理的应用前提是必须是目标类基于统一的接口,如果没有统一的接口那么jdk动态代理就无法使用

public class Test implements TestImpl {

    @Override
    public String getName(String name) {
        return name;
    }

    @Override
    public int getOld(String id) {
        return Integer.valueOf(id) + 1;
    }
}

public interface TestImpl {
    public String  getName(String name);
    public  int  getOld (String id) ;

}

class InvocationMyHandler  implements InvocationHandler{

    /**
     * 被代理者
     */
    private Object   target ;

    /**
     * 构造方法
     * @param target  需要代理的目标对象
     */
    public InvocationMyHandler(Object target) {
        this.target = target;
    }

    /**
     * 在这里是需要多代理进行操作的,通过代理者给被代理者进行的操作都在该方法中
     * @param proxy   代理 者
     * @param method   被执行的方法
     * @param args    执行该方法需要的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object  object   =  method.invoke(target,args);
        return object;
    }
}


public class Main {

    public static void main(String[] args) {
        Test  test  = new Test() ;
        InvocationMyHandler  handler = new InvocationMyHandler(test);
        Test  proxy  = (Test) Proxy.newProxyInstance(TestImpl.class.getClassLoader(),TestImpl.class.getInterfaces(),handler);
        System.out.println(proxy.getName("name"));
    }
}

该例子用接口来实现了调用其目标对象。来实现代理的,我们前面也说的了通过接口调用有局限性,如果没有实现其接口那么就不能使用代理了。结果该问题,我们可以使用cglib这个代理,来帮助我们其实现代理。

原文发布于微信公众号 - LuckQI(YoungRUIQ)

原文发表时间:2018-05-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java学习

java每日一练(2017/8/11)

(单选题) 1、关于下面的程序Test.java说法正确的是( )。 publicclass Test { staticString x="1"; sta...

2856
来自专栏郑科的专栏

PHP7 新特性简介(一)

PHP7是PHP编程语言全新的一个版本,在性能方面获得了极大的提升。官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还提供了很多其他语言流行的语...

6550
来自专栏小樱的经验随笔

【Python学习笔记之一】Python关键字及其总结

前言 最近在学习Java Sockst的时候遇到了一些麻烦事,我觉得我很有必要重新研究学习Python这种脚本语言,参考大神的经验,淘到了一本学习Python的...

3046
来自专栏LEo的网络日志

python技巧分享(七)

3388
来自专栏大神带我来搬砖

在python中像java一样反射——动态实例化指定包下面所有的类

在项目中需要在python中把某个包下面所有的类都实例化一个对象,把这些对象放到一个集合中,在java中可以通过反射机制来实现,先获得这个包下面所有的Class...

4317
来自专栏栗霖积跬步之旅

1.2使用多线程

一个进程正在运行时,至少会有一个线程在运行。线程在后台默默执行,比如调用main方法的线程就是如此,它是由JVM创建的。 class Test { pu...

2046
来自专栏Celebi的专栏

C/C++ 学习笔记七(内存管理)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

2880
来自专栏章鱼的慢慢技术路

容易出错的 if 语句

1296
来自专栏栗霖积跬步之旅

1.7停止线程

线程停止:在线程处理完任务之前,停掉正在做的操作,也就是放弃当前操作。 在java中有三种方法可以实现线程的停止: 使用退出标志,使线程正常退出,也就是当run...

2060
来自专栏何俊林

NDK开发才是有精华和特色的部分

通常有特色的应用都会涉及NDK开发,而NDK开发基本是C/C++开发,核心和精华也是在这块。像滤镜、美颜、美肤、人脸识别,编解码,这些出了问项目问题外,首先要过...

3113

扫码关注云+社区

领取腾讯云代金券