Java核心机制的知识概要

1.ORM(Object Relationship Mapping) 对象关系映射

2.动态语言:程序运行时,可以改变程序结构或变量类型,如Python、ruby等
但java不是动态语言,只是具有一定的动态性

3.获取class对象的方式:(1)使用Class.forName()获取指定名称的类
(2)使用 对象.class 获取Class(获取类的Class对象)

4.对象,接口、枚举、注解、基本类型均有Class对象与之对应

5.Class类是java的对象的类型,当JVM创建对象时,会为之创建Class对象,将对象的结构信息放入Class对象的中
。通过Class对象就可获取到类的所有信息,就像在镜子中反射一下。

6.Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

7.通过Class对象,可以获取到Constructor构造器,通过构造器newInstance(Object... initargs )实例化对象
获取Method,得到方法的信息,然后通过invoke(Object obj, Object... args )调用对象的方法,并为方法传入参数
获取Field,得到属性的信息,然后set(Object obj, Object value )设置属性的信息

8.利用反射操作泛型
blog.csdn.net/kobejayandy/article/details/11709043

9、强制类型转换(优先级高--->优先级低)
优先级低--->优先级高  会自动转换

10.java泛型总结
www.cnblogs.com/lwbqqyumidi/p/3837629.html
java泛型详解
blog.csdn.net/jinuxwu/article/details/6771121

11.java动态编译(通过调用API调用工具编译、执行)
www.cnblogs.com/snake-hand/p/3159694.html

12.java中使用脚本引擎执行javascript代码(Rhino)
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");

13.字节码操作

14.ReflectionUtils

15.Java学习之动态编译--字节码操作--javassist类库
(java代码编译完会生成.class文件,就是一堆字节码。JVM(准确说是JIT)会解释执行这些字节码(转换为机器码并执行),由于字节码的解释执行是在运行时进行的,手工编写字节码,再由JVM执行)
blog.csdn.net/haitaofeiyang/article/details/44264685
www.cnblogs.com/hucn/p/3636912.html

16.java类加载全过程
my.oschina.net/volador/blog/87194
java类加载器原理解析
blog.csdn.net/zhoudaxia/article/details/35824249

初始化:
执行类构造器<clinit>方法的过程。类构造器<clinit>方法是由编译器自动收藏的所有类变量的赋值动作和静态语句块中的语句合并产生的。

17.深入探讨java类加载器
blog.csdn.net/studyvcmfc/article/details/7720322

18.类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。    
java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。

19.类缓存:一旦某个类被加载到类加载其中,它将维持加载(缓存),不过JVM垃圾收集器可以收集这些class对象

20.类加载器的树状组织结构
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

21.ClassLoader的作用:类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。
java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字节代码,然后从这些字节代码中定义出一个 Java 类,即 java.lang.Class类的一个实例。除此之外,ClassLoader还负责加载 Java 应用所需的资源,如图像文件和配置文件等。

22. 类加载器的代理模式(不是所有) :双亲委派机制:当接到类加载的任务时,加载器首先将加载任务委派给父加载器,依次追朔,直到爷爷最高辈的。 如果父加载器能加载,就由父加载器执行,否则再由当前加载器加载。
     双亲委派机制为了保证java核心库的安全

23.自定义类加载器:
(1)继承classLoader
(2)判断类是否被加载过,若加载过,直接返回;若没有加载,委派父加载器加载,若加载器都没有加载,则通过io流读取文件,获取字节数组,并转换为class对象

24.自定义加密、解密类加载器
加密后出现java.lang.ClassFormatError: Incompatible magic value,因为class结构改变了,所以需要解密
 类加载按原来的规则加载class,class加密后格式变了,所以加载不了

经过编译器编译,变成JVM所能解释的.class文件。
而这个过程,在现在公开的网络技术中,利用一个反编译器,任何人都可以很容易的获取它的源文件。

25.类加载器是 Java 语言的一个创新。它使得动态安装和更新软件组件成为可能

26.blog.csdn.net/zhoudaxia/article/details/35897057
线程上线文加载器:java提供了一些服务性的接口,而接口的实现类由第三方提供,这样由于双亲加载机制就加载不了实现类,默认的线程上下文加载器是类加载器,可以指定类加载器,抛弃双亲委派机制

web容器加载器:该类加载器也使用代理模式,所不同的是它是首先尝试去加载某个类,如果找不到再代理给父类加载器。这与一般类加载器的顺序是相反的。这是 Java Servlet 规范中的推荐做法,其目的是使得 Web 应用自己的类的优先级高于 Web 容器提供的类。(每个应用有对应的加载器)

OSGI(Open Service GateWay Initative  面向java的动态模块系统)加载器:OSGi 中的每个模块都有对应的一个类加载器。它负责加载模块自己包含的 Java 包和类。当它需要加载 Java 核心库的类时(以 java开头的包和类),它会代理给父类加载器(通常是启动类加载器)来完成。当它需要加载所导入的 Java 类时,它会代理给导出此 Java 类的模块来完成加载。

27.java内部类
blog.csdn.net/qq435757399/article/details/7037007
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 。

静态内部类(加载顺序 :静态属性-静态代码块-非静态属性-构造方法)
(1)静态内部类可以包含静态成员、也能包含非静态成员
(2)静态内部类,能访问外部内的静态成员,但不能访问外部内的非静态成员(静态内部类已被加载)
创建:new 外部类.内部类()

成员内部类
(1)就像成员变量存在外部类中,成员内部类可以访问外部内的所有成员
(2)成员内部类中this表示内部类对象,需要访问外部类 使用“外部类名+".this" ”
(3)成员内部类中不能包含静态成员,除非声明为final,并且是编译器可以确定的常量表达式
(4)成员内部类对象一定要绑定到外部类的对象,所以有外部类的对象,后有成员内部类的对象
创建:new 外部内().new 内部类()

方法内部类
(1)方法内部类作用和局部变量类似,所以不能用private、protected等修饰
(2)方法内部类只能包含非静态成员
(3)方法内部类只能在声明的方法中可见,需要用的话,只能自方法中进行初始化。

匿名内部类
接口式(接口中)
继承式
参数式

28.java各版本特性区别
blog.csdn.net/thunderous/article/details/5342125

29.Javassit其实就是一个二方包,提供了运行时操作Java字节码的方法。手工编写字节码,再由JVM执行
在线的应用不会频繁使用反射,因为反射的性能开销较大。其实还有一种和反射一样强大的特性,但是开销却很低,它就是Javassit。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值