一.类的加载机制

jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的过程。
(1)加载
         将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。

(2)链接 将java类的二进制代码合并到jvm的运行状态之中的过程。

    1. 验证:确保加载的类信息符合jvm规范,没有安全方面的问题。
    2. 准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
    3. 解析:虚拟机常量池内的符号引用替换为直接引用的过程。(比如String s ="aaa",转化为 s的地址指向“aaa”的地址)

(3)初始化
        初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。
        当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初始化其父类的初始化
        虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步
        当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。
二.java反射机制

通俗地说:反射就是将Student类中的方法、成员变量、构造方法,抽象出来可以让Class的对象单独进行访问。
       JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

1、获取Class对象的三种方式

(1)通过调用forName(String className),注意className的格式为:包名.类名获得Class对象。

(2)通过类获取Class对象,String.class、int.class这些字节码是Class类的对象。

(3)通过类的对象获取Class对象。

 public static void getClass1() throws ClassNotFoundException {
//获取Class的方法
//正射
Student stu=new Student();
//第一种(优先选择):传的是包名.类名,通过包名和类名获得反射Class
Class cl1=Class.forName("day20.Student");
//第二种:通过类来获取Class对象
Class cl2=Student.class;
//第三种:通过对象获取Class对象
Student s=new Student();
Class cl3=s.getClass();
//判断三种方法是否是同一个Class对象
System.out.println(cl1==cl2);
System.out.println(cl2==cl3); }

2、获取构造方法

(1)获取公开的构造方法

(2)获取所有的构造方法

主要为调取Student类中的私有方法。注意:不能获得Student类的父类Human中的构造方法。

(3)调用特定的构造方法

无参构造和有参构造方法Constructors1.newInstance();//实例化获取的类

私有构造方法的调用,要注意要设置其访问权限Constructors1.setAccessible(true)。

 public static void getConstruction() throws Exception {
//获取构造方法
Class cl=Class.forName("day20.Student");
System.out.println("==========公开的构造方法==========");
//获得公开的构造方法
Constructor[] cons=cl.getConstructors();
for(Constructor con:cons) {
System.out.println(con);
}
System.out.println("==========所有的构造方法==========");
//获得所有的构造方法
Constructor[] constructors=cl.getDeclaredConstructors();
for (Constructor con:constructors
) {
System.out.println(con);
}
System.out.println("==========调用构造方法==========");
//调用无参构造方法
Constructor constructors1=cl.getConstructor();
Student student=(Student)constructors1.newInstance();
//调用有参构造方法
Constructor constructors2=cl.getConstructor(String.class);
Student student1=(Student) constructors2.newInstance("英语");
//调用私有构造方法
Constructor constructors3=cl.getDeclaredConstructor(int.class);
constructors3.setAccessible(true);//因为是私有化的方法,所以要设置访问权限
Student student2=(Student) constructors3.newInstance(2);
}

执行结果:

==========公开的构造方法==========
public day20.Student(java.lang.String)
public day20.Student()
==========所有的构造方法==========
private day20.Student(int)
public day20.Student(java.lang.String)
public day20.Student()
==========父类的构造方法==========
无参构造方法
有参构造方法英语
私有构造方法2

3、获取方法

私有属性的调用,要注意要设置其访问权限Constructors1.setAccessible(true)。

 private static void getMethod1() throws Exception {
Class cl=Class.forName("day20.Student");
//获取所有公开的方法,包括Object中的类
Method[] method=cl.getMethods();
for (Method m:method
) {
System.out.println(m.getName());
}
//获取本类中所有的方法,不包括父类和eObject
System.out.println("==========私有方法==========");
Method[] methods=cl.getDeclaredMethods();
for (Method ms:methods
) {
System.out.println(ms.getName());
}
//调取方法
System.out.println("==========调取特有方法==========");
//获取非静态的无参方法
Method method1=cl.getMethod("eat");
//获取Student类的成员
Constructor constructor=cl.getConstructor();
Student student=(Student)constructor.newInstance();
method1.invoke(student);
//获取非静态含参方法
Method method2=cl.getMethod("study", String.class);
method2.invoke(student,"物理");
//获取静态无参方法
Method method3=cl.getMethod("sleep");
method3.invoke(null);
//获取静态含参方法
try {
Method method4=cl.getMethod("saveMoney", double.class);
method4.setAccessible(true);
method4.invoke(null,100.0);
}catch (NoSuchMethodException e){
e.getMessage();
}catch(Exception e){
e.getMessage();
} }                                                                                                                                                        

执行结果:

getName
setName
sleep
study
eat
setMoney
getMoney
getAge
setAge
getSex
setSex
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
==========私有方法==========
getName
setName
sleep
study
eat
saveMoney
setMoney
getMoney
getAge
setAge
==========调取特有方法==========
吃饭
学习物理
睡觉

4、获取属性

 private static void getAttribute1() throws Exception{
Class cl=Class.forName("day20.Student");
//获取所有属性
Field[] fields=cl.getFields();
for (Field field:fields
) {
System.out.println("属性值有:"+field.getName());
}
//获取私有化属性
Field field=cl.getDeclaredField("money");
field.setAccessible(true);
//获取Student类的成员
Constructor constructor=cl.getConstructor();
Student student=(Student)constructor.newInstance();
student.setMoney(100);
System.out.println("通过对象.方法进行属性赋值:"+student.getMoney());
field.set(student,200);
System.out.println("通过Field对象.方法进行赋值:"+student.getMoney());
}

执行结果:

属性值有:name
通过对象.方法进行属性赋值:100.0
通过Field对象.方法进行赋值:200.0

Student类和父类

 package day20;

 public class Student extends Human{
public String name;
int age;
private double money; public Student() {
System.out.println("无参构造方法");
}
public Student(String subject) {
System.out.println("有参构造方法"+subject);
} private Student(int i) {
System.out.println("私有构造方法"+i);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
} public void eat(){
System.out.println("吃饭");
} public void study(String subject){
System.out.println("学习"+subject);
} public static void sleep(){
System.out.println("睡觉");
} private static void saveMoney(double money){
System.out.println("存款"+money);
}
} package day20; public class Human {
private String sex;
public Human(){ } private Human(int i){ } public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
}
}

java 类加载机制和反射机制的更多相关文章

  1. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  2. java的泛型与反射机制

    什么是泛型? 泛型,即“参数化类型”.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参) ...

  3. Java 核心类库之反射机制

    1:什么是反射机制? 2:反射机制它可以做什么呢? 3:反射机制对应的API又是什么? 1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名: 2):实例化Class对象 3):获取对象的 ...

  4. Java类加载和类反射回顾

    今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...

  5. JAVA(五)反射机制/Annotation

    成鹏致远 | lcw.cnblog.com |2014-02-04 反射机制 1.认识Class类 在正常情况下,必须知道一个类的完整路径之后才可以实例化对象,但是在 java中也允许通过一个对象来找 ...

  6. java.lang.Class<T> -- 反射机制及动态代理

    Interface : Person package java_.lang_.component.bean; public interface Person { String area = " ...

  7. java的RTTI和反射机制

    RTTI,即Run-Time Type Identification,运行时类型识别.RTTI能在运行时就能够自动识别每个编译时已知的类型. 很多时候需要进行向上转型,比如Base类派生出Derive ...

  8. java.lang.Class<T> -- 反射机制

    1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  9. 在JAVA中,关于反射机制的讨论

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

随机推荐

  1. Vue.directive自定义指令

    Vue除了内部指令,我们也可以定义一些属于自己的指令,比如我们要定义一个v-diy的指令,作用就是让文字变成红色. 写好了这个功能,我们现在就自己定义一个全局的指令.我们这里使用Vue.directi ...

  2. CommandLine exe参数

    [Verb("OptionsEntity")] public class OptionsEntity { [Option('a', HelpText = "Plantfo ...

  3. spring配置freemarker

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  4. POJ 3279 Fliptile(翻格子)

    POJ 3279 Fliptile(翻格子) Time Limit: 2000MS    Memory Limit: 65536K Description - 题目描述 Farmer John kno ...

  5. 无法获取未定义或 null 引用的属性“contentWindow”

    在iframe 中有时候 这样使用contentWindow 会报   无法获取未定义或 null 引用的属性“contentWindow”   这种情况 我是在IE中遇到 其他浏览器一切正常. pa ...

  6. SqlParameter 多个参数动态拼接解决参数化问题

    多个参数化是固定比较easy,多个动态的就有点...工作中遇到的问题整理下来分享 ,上代码 SqlParameter[] param = new SqlParameter[] { }; List< ...

  7. C++类模板和模板类

    C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...

  8. 【Django】【二】模板

    1. Django-bootstrap3 guest>python -m pip install django-bootstrap3 [代码] settings.py ""& ...

  9. python中关于列表和元祖的基础知识

    一,列表 1)定义: []内以逗号分隔,按照索引,存放各种数据类型,每一个位置代表一个元素 2)特性: 1 可存放多个值 2 按照从左到右的顺序定义列表元素,下标为零开始顺序访问,有序 3可修改指定索 ...

  10. 前端阶段_div以及css介绍

    1.div div是html的一个标签,是块级元素,单独使用没有意义,必须结合css来使用,进行网页布局 2.span span是一个html标签,是一个内联元素,主要对括起来的内容进行修饰 3.&l ...