反射技术

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

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   ~码铃薯~  阅读(118)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示