一、類是怎麼加載到內存中的
1.類的加載:
就是將class文件讀入內存,並創建一個class對象任何類在使用時系統都會創建一個class對象
2.類的加載時機:
(1).創建類的實例
(2).訪問類的靜態成員
(3).通過反射創建對象
(4).初始化某個子類
(5).運行main方法
3.加載器:負責將.class加載到內存,並生成Class對象
(1).BootStrap ClassLoader(根類加載器):負責java核心類的加載(jdk\jre\lib\rt.jar,API)
(2).Extension ClassLoader(擴展類加載器): 負責JRE的擴展目錄中的jar包的加載(jdk\jre\lib\ext目錄中)
(3).System ClassLoader(系統類加載器):負責字JVM啓動時加載來自java命令的class文件,以及classpath環境變量指定的jar包和類路徑
二、反射(reflect)
定義:在運行過程中“動態的獲取對象的信息”和“動態的調用對象的方法”的功能就是反射
實現:就是獲取Class對象,操作Class對象
三、獲取Class對象
第一種:Object的getClass()方法返回Object的運行時類
第二種:通過任意對象的class靜態屬性
第三種:將類名作爲字符串參數傳遞給Class類的forName()方法,參數使用類的帶包路徑
- package com.et.example;
- public class ReflectTest {
- public static void main(String[] args) throws ClassNotFoundException {
- //對象的getClass()方法返回對象的運行時類
- Animal a = new Animal();
- Class<? extends Animal> c1 = a.getClass();
- //任意對象的class靜態屬性
- Class<? extends Animal> c2 = Animal.class;
- //類名作爲字符串參數傳遞給Class類的forName()方法,參數使用類的帶包路徑
- Class<? extends Object> c3 = Class.forName("com.et.example.Animal");
- System.out.println(c1==c2);
- System.out.println(c2==c3);
- }
- }
- class Animal {
- private int age;
- private String name;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @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 (getClass() != obj.getClass())
- return false;
- Animal other = (Animal) 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 "Animal [age=" + age + ", name=" + name + "]";
- }
- }
四、通過反射獲取類的構造方法
- package com.et.example;
- import java.lang.reflect.Constructor;
- public class ReflectTest {
- public static void main(String[] args) throws Exception{
- Class<? extends Object> c = Class.forName("com.et.example.Animal");
- //可獲取訪問權限內的構造方法
- Constructor<? extends Object> cst1 = c.getConstructor(int.class,String.class);
- //可獲取類的所有構造方法
- Constructor<? extends Object> cst2 = c.getDeclaredConstructor();
- //取消對Java語言的訪問檢查
- cst2.setAccessible(true);
- Animal a1 = (Animal) cst1.newInstance(10,"小提莫");
- Animal a2 = (Animal) cst2.newInstance();
- System.out.println(a1);
- System.out.println(a2);
- }
- }
- class Animal {
- private int age;
- private String name;
- private Animal(){
- }
- public Animal(int age,String name) {
- this.age = age;
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @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 (getClass() != obj.getClass())
- return false;
- Animal other = (Animal) 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 "Animal [age=" + age + ", name=" + name + "]";
- }
- }
5.通過反射獲取成員變量
- package com.et.example;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- public class ReflectTest {
- public static void main(String[] args) throws Exception{
- Class<? extends Object> c = Class.forName("com.et.example.Animal");
- Constructor<? extends Object> cst = c.getDeclaredConstructor();
- cst.setAccessible(true);
- Animal animal = (Animal) cst.newInstance();
- Field age = c.getDeclaredField("age");
- Field name = c.getDeclaredField("name");
- age.setAccessible(true);
- name.setAccessible(true);
- age.set(animal,20);
- name.set(animal,"大提莫");
- System.out.println(animal);
- }
- }
- class Animal {
- private int age;
- private String name;
- private Animal(){
- }
- public Animal(int age,String name) {
- this.age = age;
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @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 (getClass() != obj.getClass())
- return false;
- Animal other = (Animal) 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 "Animal [age=" + age + ", name=" + name + "]";
- }
- }
6.通過反射獲取普通方法
- package com.et.example;
- import java.lang.reflect.Method;
- public class ReflectTest {
- public static void main(String[] args) throws Exception{
- Class<? extends Object> c = Class.forName("com.et.example.Animal");
- Method[] methods = c.getDeclaredMethods();
- for(Method method:methods) {
- //獲取方法的權限類編號
- int modifiers = method.getModifiers();
- //獲取方法的參數類型
- System.out.print(modifiers+"--");
- Class<?>[] parameterTypes=method.getParameterTypes();
- for(Class parameterType:parameterTypes){
- System.out.print(parameterType+"--");
- }
- System.out.println(method.getName());
- }
- }
- }
- class Animal {
- private int age;
- private String name;
- private Animal(){
- }
- public Animal(int age,String name) {
- this.age = age;
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @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 (getClass() != obj.getClass())
- return false;
- Animal other = (Animal) 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 "Animal [age=" + age + ", name=" + name + "]";
- }
- }