谈谈你对Java的理解
- 平台无关性
- GC
- 面向对象
- 语言特性(封装、集成、多态)
- 异常处理
- 类库
平台无关性
java跨平台以及一次编译多地运行的策略依赖于java提出的中间文件.class文件,首先将.java文件通过javac
命令将.java文件编译成二进制字节码文件,在交由JVM转换成当前机器可识别的机器码,放入内存以供机器执行
JVM的组成
JVM由类加载器(classloader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine )、本地接口(Native Interface)、本地库(Native Libraies )
- Class Loader:类加载器,用于将class文件加载到JVM内存中
- Runtime Data Area:运行时数据区,JVM内存模型,所有的字节码载入这个模块在运行
- Execution Engine:执行引擎,用来将字节码内容转换成机器码并执行
- Native Interface:本地接口,用于调用本地方法库,主要为navtive方法
- Native Libraies:本地方法库
反射
定义是在运行状态中,对于任何一个类,都能知道这个类的属性与方法,对于任意对象,都可以调用它的方法,以及修改属性;这种动态获取信息与动态调用对象方法的功能称为java语言反射机制
package com.bdcloud.bean;
//常用的Bean
public class User {
private String name;
private void sayHello(){
System.out.println("Hello "+name);
}
public void sayHi(){
System.out.println("Hi "+name);
}
}
package com.bdcloud.reflact;
import com.bdcloud.bean.User;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MyReflact {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
Class<?> aClass = Class.forName("com.bdcloud.bean.User");
User o = (User) aClass.newInstance();
//获取该类的私有属性
Field name = o.getClass().getDeclaredField("name");
//设置该属性可被修改
name.setAccessible(true);
name.set(o,"Lxf");
o.sayHi();
//获取该类的私有方法
Method sayHello = o.getClass().getDeclaredMethod("sayHello");
sayHello.setAccessible(true);
sayHello.invoke(o);
}
}
ClassLoader的种类
- BootStrapClassLoader:C++编写,加载核心库java.*
- ExtClassLoader: java编写,加载扩展类库javax.*
- AppClassLoader: java编写,加载程序所在目录(classpath)
- 自定义ClassLoader:java编写,定制化加载
自定义ClassLoader要加载的类
package com.bdcloud.bean;
/****
** 自定义类加载器要加载的类
*/
public class User2 {
static {
System.out.println("jiazai User2");
}
}
自定义ClassLoader
package com.bdcloud.classloader;
import javax.print.attribute.standard.RequestingUserName;
import java.io.*;
public class MyClassLoader extends ClassLoader {
private String path;
private String name;
public MyClassLoader(String path,String name){
this.path = path;
this.name = name;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
return defineClass(name,b,0,b.length);
}
private byte[] loadClassData(String name) {
String fileName = path + name
+".class";
InputStream inputStream = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
inputStream = new FileInputStream(new File(fileName));
int i = 0;
while ((i=inputStream.read())!=-1){
outputStream.write(i);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return outputStream.toByteArray();
}
}
自定义ClassLoader的测试类
package com.bdcloud.classloader;
public class MyClassLoaderTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyClassLoader classLoader = new MyClassLoader("H:\\tools\\ReflactDemo1\\src\\main\\java\\com\\bdcloud\\bean\\","AAA");
//loadClass传入的name名称为包路径+类名
Class<?> user2 = classLoader.loadClass("com.bdcloud.bean.User2");
user2.newInstance();
}
}
classloader的双亲委派机制
classloader的双亲委派机制是在收到请求需要加载class文件时,AppClassLoader不会首先加载,而是交给上一级类加载器ExtClassLoader加载,ExtClassLoader加载