Java的理解

谈谈你对Java的理解

  • 平台无关性
  • GC
  • 面向对象
  • 语言特性(封装、集成、多态)
  • 异常处理
  • 类库

平台无关性

java跨平台以及一次编译多地运行的策略依赖于java提出的中间文件.class文件,首先将.java文件通过javac
命令将.java文件编译成二进制字节码文件,在交由JVM转换成当前机器可识别的机器码,放入内存以供机器执行

JVM的组成

JVM由类加载器(classloader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine )、本地接口(Native Interface)、本地库(Native Libraies )
Java的理解_第1张图片

  • 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加载

loadClass与forName的区别

你可能感兴趣的:(Java的理解)