IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> D5 新特性总结 -> 正文阅读

[Java知识库]D5 新特性总结

1. 反射

反射:通过对象求出类的名称,加载完类之后,堆内存方法区中产生了Class对象,通过这个对象看到类的结构就被称为反射

java通过反射机制获得动态性,变为准动态语言

Reflection API使程序执行期间可以取得任何类的内部信息,并能直接操作对象的内部属性和方法


1.1 反射的相关概念

new和反射的区别:

  • 反射的特征是动态性,编译时不确定怎么new,就选择反射

反射与封装性:

  • 反射使程序员具备这些能力,但是public、private表明了程序建议怎么使用

类的加载过程:

  1. 程序经过javac.exe命令生成一个或多个字节码文件.class
  2. 使用java.exe命令对某个字节码文件解释运行,相当于把该文件加载到内存中
  3. 加载到内存中的类被称为运行时类,作为Class的一个实例,即Class的实例对应着一个运行时类
  4. 运行时类会缓存一定时间,在此过程中通过不同方式获取的Class实例是同一个运行时类

主要使用反射的方式:

  • 调用Class的静态方法forName(String classPath)获取运行实例

Class实例的说明:

  • 类型相同,维度相同,即为同一Class

类加载器分类:

  • 引导类加载器:C++编写,JVM自带,装载核心类库,无法获取 – String
  • 扩展类加载器:负责jre/lib/ext目录下的jar包装载
  • 系统类加载器:负责java-classpath目录下的类与jar包装载,最常用

1.2 动态代理

代理设计模式:

使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。

实现动态代理需要解决的问题:

  • 如何根据加载到内存中的被代理类动态创建一个代理类及其对象?
  • 代理类对象调用方法时如何动态的调用被代理类的同名方法?
  • AOP:面向切面编程,利用动态代理实现:
    • 通用方法1 - 目标对象的方法 - 通用方法2

动态代理示例代码:

interface Human{
    String getBelief();
    void eat(String food);
}

class SuperMan implements Human{
    @Override
    public String getBelief() {
        return "I can fly";
    }

    @Override
    public void eat(String food) {
        System.out.println("我喜欢吃" + food);
    }
}

class MyInvocationHandler implements InvocationHandler{
    private Object obj;
    public void bind(Object obj){
        this.obj = obj;
    }

    /**
     * 通过代理类的对象调用方法时,会自动地调用invoke()
     * 将被代理类执行的方法声明在invoke()中
     * method即代理类对象调用的方法。也就是被代理类对象要调用的方法
     *
     */

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("通用方法1");
        Object invoke = method.invoke(obj, args);
        System.out.println("通用方法2");
        return invoke;
    }
}
class ProxyFactory{
    public static Object getProxyInstance(Object obj){
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
    }
}

public class ProxyTest {
    public static void main(String[] args) {
        SuperMan jack = new SuperMan();
        Human human = (Human) ProxyFactory.getProxyInstance(jack);
        human.eat("氪石");
        System.out.println(human.getBelief());
    }
}

2. 其它新特性

lambda表达式、Stream API等新特性目前可以看懂即可,需要时再学习。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 13:57:03  更:2021-09-27 13:58:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:04:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码