day27(027-反射&JDK新特性)

###27.01_反射(类的加载概述和加载时机)

 A:类的加载概述

  *加载   就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。

  *连接   准备,负责为类的静态成员分配内存,并设置默认初始化值。

  *初始化

 B:加载时机

    创建类的实例
    访问类的静态变量,或者为静态变量赋值
    调用类的静态方法
    初始化某个类的子类
    使用反射机制方式来强制创建某个类或接口对应的java.lang.Class对象

###27.03_反射(反射概述) 

A:反射概述

  Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
  对于任意一个对象,都能够调用它的任意一个方法和属性;
  使用的就是Class类中的方法,先要获取到每一个字节码文件对应的Class类型的对象。

B:三种方式

  a:Object类的getClass()方法,判断两个对象是否是同一个字节码文件

  b:静态属性class ,锁对象

  c:Class类中静态方法forName(),读取配置文件

 

package com.heima.reflect;

import com.heima.bean.Person;

public class Demo1_Reflect {

    /**
     * @param args
     * @throws ClassNotFoundException 
     */
    public static void main(String[] args) throws ClassNotFoundException {
        Class clazz1 = Class.forName("com.heima.bean.Person");
        Class clazz2 = Person.class;
        
        Person p = new Person();
        Class clazz3 = p.getClass();
        
        System.out.println(clazz1 == clazz2);
        System.out.println(clazz2 == clazz3);
    }

}
Demo1_Reflect

实体类

package com.heima.bean;

public class Person {
    private String name;
    private int age;
    public Person() {
        super();
        
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    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;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (this.getClass() != obj.getClass())        //判断调用对象和传入对象的字节码文件是否是同一个字节码文件
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    
    public void eat() {
        System.out.println("今天吃了一顿金钱豹");
    }
    
    public void eat(int num) {
        System.out.println("今天吃了" + num + "顿金钱豹");
    }
}
public class Person

  

猜你喜欢

转载自www.cnblogs.com/MarlonKang/p/12293781.html