66.【注解与反射】(三)

简介: 66.【注解与反射】

9.类加载内存分析

java的内存分析:

类的加载过程:

类的加载与classLoader的理解

package com.Kuang.reflectiom;
public class Demo8 {
    public static void main(String[] args) {
        A s=new A();
        System.out.println(A.m);
    }
}
class  A{
    static {
        System.out.println("A 类静态代码初始化");
        m=300;
    }
    static int m=100;
    public A(){
        System.out.println("A 类的无参构造初始化");
    }
}

10.分析类初始化

什么时候会发生类初始化?
1.类的主动引用(一定会发生类的初始化)
(1).当虚拟机启动,先初始化main方法所在的类
(2).new 一个类的对象
(3).调用类的静态成员(除了final常量)和静态方法
(4).使用reflect 的方法进行反射调用
(5).当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类
"(意思就是:当我们new子类的对象的时候,父类的构造器会被先初始化)"
2.类的被动引用(不会发生类的初始化)
(1).当访问一个静态域时,只有真正声明这个域得类才会被初始化,
(2).通过数组定义类引用,不会触发此类的初始化
(3).引用常量不会触发此类的初始化
当初始化一个类,如果其父类没有被初始化,则先会初始化它的父类
package com.Kuang.reflectiom;
public class Demo9 {
    static {
        System.out.println("main类被加载!");
    }
    public static void main(String[] args)  {
        //Son son=new Son();
        //利用反射的方法
        try {
            Class.forName("com.Kuang.reflectiom.Son");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
class Father{
    static int b=2;
    static {
        System.out.println("父类被加载");
    }
}
class Son extends Father{
    static {
        System.out.println("子类被加载");
        m=300;
    }
    static int m=100;
    static final int M=1;
}

11.类加载器

1.类加载器的作用: 
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法去的运行时
数据结构,然后在堆中生成一个戴白哦这个类的class对象,作为方法区中类数据
的访问入口
2.java文件过程:
java文件--->java编译器---->字节码(.class文件)---->类装载器
----->字节码校验器----->解释器----->操作系统平台
3.类加载器的作用:
类加载器的作用是用来把类(class)装载进内存的,jvm规范定义了如下的加载器:
(1).引导类加载器: jvm自带的加载器,"负责java平台核心库"。该加载器无法直
接获取.
(2).扩展类加载器: 负责jre/lib/ext目录库下的jar包
(3).系统加载器:负责classpath或path所指目录下的jar包
package com.Kuang.reflectiom;
public class Demo10 {
    public static void main(String[] args) {
        //获取系统类的加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);
        //获取系统类的加载器的父类加载器---->扩展类加载器
        ClassLoader parent = systemClassLoader.getParent();
        System.out.println(parent);
        //获取扩展类加载器的父类  ---->跟加载器
        ClassLoader parent1 = parent.getParent();
        System.out.println(parent1);
        //当前类是那个加载器加载的?
        try {
            ClassLoader classLoader = Class.forName("com.Kuang.reflectiom.Demo7").getClassLoader();
            System.out.println(classLoader);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

12.获取类运行时类的完整结构

1.获得包名+类名
System.out.println(aClass.getName());  
2.获得类名
System.out.println(aClass.getSimpleName());  
3.获得类的全部属性
aClass.getDeclaredFields()
4.获得类的public属性
aClass.getField();
5.获得本类的及父类的全部public方法
aClass.getMethods();
6.获得类的所有方法
aClass.getDeclaredMethods();
7.获得类的指定方法:
aClass.getMethod();
7.获得全部构造器:
aClass.getDeclaredConstructors();
package com.Kuang.reflectiom;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Demo11 {
    public static void main(String[] args) {
        try {
            Class<?> aClass = Class.forName("com.Kuang.reflectiom.User");
            //获得类的名字
            System.out.println(aClass.getName());  //获得包名+类名
            System.out.println(aClass.getSimpleName());  //获得类名
            //获得类的属性
            Field[] fields=aClass.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
            }
            System.out.println("------------------");
            //获得类的方法
            Method[] declaredMethods = aClass.getDeclaredMethods();
            for (Method declaredMethod : declaredMethods) {
                System.out.println(declaredMethod);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}


相关文章
|
3月前
|
Java 程序员 API
注解和反射
这篇文章详细介绍了Java注解的概念、作用、内置注解、元注解、自定义注解,
注解和反射
|
4月前
|
Java 程序员 编译器
注解和反射(一)
注解和反射
31 0
|
4月前
|
Java 编译器
注解和反射(二)
注解和反射
25 0
|
编译器
反射、注解和泛型相关的坑
根据反射来获取方法,很多人觉得获取方法传入参数就可以了,但是遇到方法的重载的时候,怎么能够知道此次执行走的是哪个方法呢?
|
Oracle Java 关系型数据库
反射与自定义注解
反射与自定义注解
反射与自定义注解
|
Java 数据库连接 编译器
Java注解详解,自定义注解,利用反射解析注解
概要 这篇文章将会带领你了解Java注解,注解的使用,注解的解析,利用反射解析运行时注解,相信有一定Java基础的小伙伴一定会接触大量的注解,Spring , Hibernate , MyBatis等著名的框架也有很多关于注解方面的应用,对于注解的使用...
2628 0
|
程序员
注解和反射2.内置注解
注解和反射2.内置注解