反射技术

这是整个小项目的架构图:
反射一般用在框架和中间件的开发中,在实际项目开发中一般用的比较少。

img

创建一个实体类:

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代码在计算机中经历的三个阶段:

img

第一个阶段,你写的类文件还没有进到内存中了。

第二个阶段,表示的是.class字节码文件。

第二个阶段,已经将的的class文件加载到内存中了。

第三个阶段,表示运行时阶段

posted on 2020-09-09 22:59  ~码铃薯~  阅读(115)  评论(0编辑  收藏  举报

导航