Java反射-Class类

反射

思考:有没有方法,能在程序运行时去操作一个新建的类?

  • 反射可以做到,反射是java的一种操作类的机制,反射就是通过Class实例获取对应class的信息

反射基本框架

Class newclass= Class.forname(className);
//获取类的Class对象(包括类的详细信息)
//注意className必须是全限定名(全称)

Constructor constructor = newclass.getConstructor();
// 通过Class 对象获取构造方法对象(Constructor)

Pay pay = (Pay) constructor.newInstance();
//通过构造方法来创建对象
//Pay是一个接口,这里存在强制类型转换

一、Class类

注意: class 是一个关键字

Class 是一个类,反射里面用到的是这个,里面包含了反射需要的各种方法

1、Class类的获取

所有的类都有一个唯一的与其对应的Class对象,一共有三种方法获得Class对象

package reflect;
import reflect.Reflect;

/**
 * @className:TestClass;
 * @time:2022-05-07-20:03;
 * @author:Lee Ye;
 * @description:这是一个java示例;
 */
public class TestClass {
    public static void main(String[] args) throws ClassNotFoundException {
        //所有的类都有一个唯一的与其对应的Class对象

        Reflect ref = new Reflect();

        //1、通过Object中的getclass方法类获取Class对象

        Class<?> class1 = ref.getClass();

        //2、通过Class类中的静态方法forName来获得Class对象

        Class class2 = Class.forName("reflect.Reflect");

        //3、通过静态的class字段来获得Class类

        Class class3 = Reflect.class;

        //可以比较下三个Class是否相同

        System.out.println(class1 == class2);
        System.out.println(class2 == class3);

        
        //测试class静态字段,以及通过String类测试每个类只有一个对应的Class方法
        Class class4 = int.class;

        Class class5 = String.class;

        String ss = new String("this is a test");
        //String[] 也是一种类,而且不同于String.class

        Class class6 = ss.getClass();

        System.out.print("compare String Class: ");
        System.out.println(class5 == class6);
    }
}

2、动态加载

JVM在执行的时候,并不是一次性把所有的用到的class类加载到内存中,而是第一次用到时才加入进去

public class Main{
    public static void main(String[] args){
        if (args.length > 0){
            create(args[0]);
        }
    }
    public void create(String name){
        Person p = new Person(name);
    }
}

当执行Main.java的时候,会加载Main.class, 因为用到了Main这个类,如果没有进入if语句,那么就不会加载Person.class,因为没有用到;进入if语句调用create函数才加载Person.class

上述过程就是JVM的动态加载特性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值