JVM之反射

  • 平台无关性
    编译时,把源码编译成字节码
    写一个java代码,利用javac生成class文件,可以利用javap进行反汇编,生成虚指令(字节码)

    public class com.kaola.zkTest.ByteCodeSample {
      public com.kaola.zkTest.ByteCodeSample();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return
    
      public static void main(java.lang.String[]);
        Code:
           0: iconst_2
           1: istore_1
           2: iconst_5
           3: istore_2
           4: iinc          1, 1
           7: iinc          2, 1
          10: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
          13: iload_1
          14: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
          17: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
          20: iload_2
          21: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
          24: return
    }
    
    

    JVM之反射_第1张图片
    JVM之反射_第2张图片

  • jvm如何加载.class文件
    JVM之反射_第3张图片

  • 什么是反射
    反射就是把java类的各个成分映射成java对象,像Method Field Class等,用代码来理解:
    Robot.class

    package com.imooc.java.reflect;
    
    public class Robot {
        private String name;
    
        public void sayHi(String helloSentence) {
            System.out.println(helloSentence + " " + name);
        }
    
        private String throwHello(String tag) {
            return "hello " + tag;
        }
    }
    
    package com.imooc.java.reflect;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class ReflectSample {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
            Class rc = Class.forName("com.imooc.java.reflect.Robot");
            //通过class获取Robot实例
            Robot rb = (Robot) rc.newInstance();
            //获取class name
            System.out.println("Class name is"+rc.getName());
            //getDeclaredMethod可以获取public/private等方法,但是不能获取继承的或者实现接口的方法
            Method getHello = rc.getDeclaredMethod("throwHello", String.class);
            //因为throwHello是私有的,所以需要设置Accessible为true
            getHello.setAccessible(true);
            //相当于调用throwhello方法
            Object str = getHello.invoke(rb,"Bob");
            System.out.println("getHello result is:"+str);
            //getMethod智能获取public方法,也可以获取继承的或者实现接口的方法
            Method sayHi = rc.getMethod("sayHi", String.class);
            //这里是public方法,所以不需要设置setAccessible(true);
            sayHi.invoke(rb,"welcome");
            //跟method相似,也是取的private方法
            Field name = rc.getDeclaredField("name");
            name.setAccessible(true);
            name.set(rb,"alice");
            sayHi.invoke(rb,"welcome");
        }
    }
    
    
  • classloader

2 GC
3 语言特性
4 面向对象
5 类库
6 异常处理

你可能感兴趣的:(jvm)