JRE:运行java字节码的环境。它是运行已编译java程序所需要的所有内容的集合,主要包括java虚拟机JVM和java基础类库(class library)
JVM:**是Java Virtual Machine的缩写,即Java虚拟机。**它是一个虚构的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现。JVM的作用是在不同的平台上提供一个统一的运行环境,使得Java程序能够在任何安装了JVM的设备上运行,而不需要针对每个平台进行修改
JDK:提供给开发者使用的工具,它包含了JRE,同时还包含了编译java、源码的编译器javac以及一些其它工具,如javadoc(文档注释工具)、jdb(调试器)、jconsole(基本JMX的可视化监控工具)、javap(反编译工具)等等。
面向对象
异常
java的异常处理会影响我们程序的性能,创建一个异常非常慢,抛出一个异常又得消耗1-5ms
的时间,当一个异常在应用程序的多个层级之间进行传递时,会拖垮我们整个应用程序。
仅在异常情况下使用异常,在可恢复的异常情况下使用异常,心得使用异常有利于java开发,但是在应用中最好不要捕获太多的调用栈,因为在很多情况下都不需要打印调用栈知道哪里出错了。
使用try-with-resources是JDK1.7中提供的一个异常处理机制,它能够很容易地关闭try-catch语句中的资源。所谓的资源是指在程序结束后,必须关闭的对象。try-with-resources语句确保了每个资源在语句结束时关闭。所有实现了java.lang.AutoCloseable接口(也包括实现了java.io.Closeable的所有对象)的对象可以作为资源。
java
public static void main(String[]args]{
try(Resource res = new Resource()){
//TODO 业务逻辑处理
}catch(Exception e){
System.out.print(e.printStackTrace());
}
}
class Resource implements AutoCloseable{
void doSome(){
System.out.print("do something");
}
@Override
public void close() throw Exception{
System.out.print("resource is closed");
}
}
以上代码编译后为自动生成finally代码块,里面会对try里面的Resource资源进行判空,如果非空就对其进行关闭。
在JDK9里面可以直接在try前面声明final类型的Resource,然后try-with-sources里面写上变量名即可。
集合
线程
IO
网络通信
反射
java反射是java的一个特性,它允许程序在运行时对自身进行检查,并且能够操作类、接口、字段 、方法等。反射提供强大的功能,但也带来一些技术难点。
基本原理
1、类的加载:java反射始于类的加载。当使用Class.forName()或其它类加载器加载类时,JVM会读取类的字节码文件,并将其转化为Class对象,这个对象包含了元数据信息,如类名、包名、父类、实现的接口、字段、方法等。
2、:获取类的信息:通过Class对象,我们可以获取类的各种信息,例如,使用getMethod()方法猎取类的所有公共方法,使用getDeclaredFields()方法猎取类的所有字段(包括私有字段)。
3、动态调用:反射不仅能允许我们获取类的信息,还允许我们动态地创建对象、调用方法、修改字段值等。通过newInstance()方法可能创建类的实例,通过getMethod()猎取方法并使用invoke()方法调用它。
技术难点:
1、性能:比直接操作代码更慢,因为反射涉及到动态解析和类型检查等。
2、安全性:反射允许访问类的私有成员,这可能导致安全漏洞。如果反射被恶意代码使用,可能会破坏系统的安全性。
3、复杂性:反射的操作相对比较复杂,需要深入理解java的类型系统和类加载机制。另外反射可能会带来一些安全性的问题。可以通过以下措施来尽量减少安全问题:
1、访问控制:java提供了访问控制修饰符来控制对类的成员的访问。虽然反射可以安全码这些限制,但我们应该避免在不需要时这样做。在设计API时, 应该只暴露必要的公共接口,并隐藏敏感的内部实现。
2、代码签名和验证:JVM在加载类时会对类的字节码进行验证,以确保符合java语言的规范。此外,还可以使用代码签名来验证类的来源是否可信,这可防止恶意代码被加载到JVM中。
3、最小权限原则:在编写使用反射的代码时,应遵循最小权限原则,则只请求执行所需任务所需的最小权限,例如,如果只需要可以读取某个字段的值,就不要请求修改该字段的权限。
4、安全管理器:java提供了一个安全管理器(SecurityManager)类,它允许应用程序定义自己的安全策略。通过实现自定义的安全管理器,可以限制反射的使用,例如禁止加载来自不受信息的源的类。
5、代码审计和测试:对使用反射的代码进行严格的审计和测试是确保安全性的重要步骤。这包括检查是否有不安全的反射使用,验证输入数据的有效性以及确保代码符合安全最佳实践等。
泛型