反射技术
这是整个小项目的架构图:
反射一般用在框架和中间件的开发中,在实际项目开发中一般用的比较少。
创建一个实体类:
package domain;
/**
* Created by ZhaoYongqiang on 2020/9/8.
*/
public class Person {
private String name;
private int age;
//添加几个属性,按照作用域由大到小
public String a;
protected String b;
String c;
private String d;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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 String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
public void eat(){
System.out.println("eat====");
}
public void eat(String food){
System.out.println("eat===="+food);
}
private void drink(){
System.out.println("drink====");
}
private void drink(String water){
System.out.println("drink===="+water);
}
}
获取Class对象的三种方式:
package test;
import domain.Person;
/**
* Created by zyq on 2020/9/8.
*/
public class ReflectDemo1 {
/**
* * 获取Class对象的方式:
* 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象
* 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
* 2. 类名.class:通过类名的属性class获取
* 多用于参数的传递
* 3. 对象.getClass():getClass()方法在Object类中定义着。
* 多用于对象的获取字节码的方式
*
* @param args
*/
public static void main(String[] args) throws Exception {
//Class.forName("全类名"):注意:这里会抛出类找不到异常 返回结果:Class<?>中的问号,表示的是泛型
Class<?> aClass = Class.forName("domain.Person");
System.out.println("=============" + aClass);
//类名.class
Class<Person> personClass = Person.class;
System.out.println("=============" + personClass);
//对象.getClass()
Person person = new Person();
Class<? extends Person> aClass1 = person.getClass();
System.out.println("=============" + aClass1);
//最终运行结果:
/**
* =============class domain.Person
=============class domain.Person
=============class domain.Person
*/
//同一个类,在类加载的时候只会被加载一次,下面,我们验证一下我我们获取到的class类对象是否是同一个
System.out.println(aClass==personClass);//true
System.out.println(aClass==aClass1);//true
}
}
运行结果:
=============class domain.Person
=============class domain.Person
=============class domain.Person
true
true
Java代码在计算机中经历的三个阶段:
第一个阶段,你写的类文件还没有进到内存中了。
第二个阶段,表示的是.class字节码文件。
第二个阶段,已经将的的class文件加载到内存中了。
第三个阶段,表示运行时阶段